Class FileBackedQueue<E>

java.lang.Object
java.util.AbstractCollection<E>
java.util.AbstractQueue<E>
de.bsvrz.dav.daf.util.fileBackedQueue.FileBackedQueue<E>
All Implemented Interfaces:
Iterable<E>, Collection<E>, Queue<E>
Direct Known Subclasses:
FileBackedByteQueue, FileBackedIntQueue, FileBackedLongQueue, FileBackedShortQueue, FileBackedStringQueue

public class FileBackedQueue<E> extends AbstractQueue<E>
Eine Queue, die Elemente beim Überschreiten eines Grenzwertes ins Dateisystem auslagert und dadurch sehr viele Elemente aufnehmen kann. Diese Queue ist abgesehen vom Iterator threadsicher. Je nach Konstruktor verwendet die Queue einen benutzerdefinierten Serializer um die Objekte im Dateisystem abzulegen, oder den Standard-Java-Serializer. Es gibt vordefinierte geerbte Queue-Klassen, die für einfache Datentypen optimierte Serializer benutzen. Für weitere Datentypen ist ein benutzerdefinierter QueueSerializer zu implementieren. Wichtig: nachdem die Queue nicht mehr gebraucht wird sollte clear() aufgerufen werden um nicht mehr gebrauchten Speicher auf der Festplatte freizugeben.
Diese Queue ist auf mehrere gleichzeitige Einfügungen von mehreren Threads spezialisiert. Das Auslesen von Objekten geht im allgemeinen sehr schnell, kann aber nur von einem Thread gleichzeitig durchgeführt werden.
Für das Speichern im Dateisystem werden die Objekte serialisiert. Das heißt, die Objekte, die zu der Queue hinzugefügt werden sind möglicherweise nicht identisch (im Sinne von Objektidentität) zu den Objekten, die aus der Queue ausgelesen werden.
See Also:
  • Constructor Details

    • FileBackedQueue

      public FileBackedQueue(int memoryCapacity, long filesystemCapacity, QueueSerializer<E> queueSerializer)
      Erstellt eine neue Queue, die durch ein Dateisystem unterstützt wird und so recht groß werden kann. Um die Objekte in das Dateisystem zu speichern, ist erforderlich, dass ein QueueSerializer angegeben wird, der die Objekte serialisiert und wieder deserialisiert.
      Parameters:
      memoryCapacity - Wie viel Speicher in Bytes maximal im Arbeitsspeicher gehalten werden sollen. Es handelt sich um einen Richtwert, der geringfügig (um die Größe eines Elements) überschritten werden kann. Berücksichtigt wird hier nicht der tatsächliche Arbeitsspeicherverbrauch, sondern die Größe, die das Element verbrauchen würde, falls es serialisiert werden würde.
      filesystemCapacity - Wie viel Speicher in Bytes maximal im Dateisystem gehalten werden sollen. Es handelt sich um einen Richtwert, der geringfügig (um maximal die Größe eines Elements minus 1 Byte) überschritten werden kann.
      queueSerializer - Klasse, die das Deserialisieren von Objekten übernimmt.
    • FileBackedQueue

      public FileBackedQueue(int memoryCapacity, long filesystemCapacity)
      Erstellt eine neue Queue, die durch ein Dateisystem unterstützt wird und so recht groß werden kann. Wird dieser Konstruktor benutzt, wird der Standard-Java-Serializer benutzt. Dieser ist bei kleinen oder primitiven Datentypen ineffektiv und funktioniert bei nicht serialisierbaren Klassen nicht.
      Parameters:
      memoryCapacity - Wie viel Speicher in Bytes maximal im Arbeitsspeicher gehalten werden sollen.
      filesystemCapacity - Wie viel Speicher in Bytes maximal im Dateisystem gehalten werden sollen. Es handelt sich um einen Richtwert, der geringfügig (um maximal die Größe eines Elements) überschritten werden kann.
  • Method Details

    • iterator

      public Iterator<E> iterator()
      Returns an iterator over the elements contained in this collection.

      It is imperative that the user manually synchronize on the returned collection when iterating over it:

        Collection c = myFileBackedQueue;
           ...
        synchronized(c) {
            Iterator i = c.iterator(); // Must be in the synchronized block
            while (i.hasNext())
               foo(i.next());
        }
       
      Failure to follow this advice may result in non-deterministic behavior.
      Specified by:
      iterator in interface Collection<E>
      Specified by:
      iterator in interface Iterable<E>
      Specified by:
      iterator in class AbstractCollection<E>
      Returns:
      an iterator over the elements contained in this collection
    • size

      public int size()
      Specified by:
      size in interface Collection<E>
      Specified by:
      size in class AbstractCollection<E>
    • offer

      public boolean offer(E e)
      Inserts the specified element into this queue if it is possible to do so immediately without violating capacity restrictions. When using a capacity-restricted queue, this method is generally preferable to AbstractQueue.add(E), which can fail to insert an element only by throwing an exception.
      Parameters:
      e - the element to add
      Returns:
      true if the element was added to this queue, else false
      Throws:
      ClassCastException - if the class of the specified element prevents it from being added to this queue
      NullPointerException - if the specified element is null and this queue does not permit null elements
      IllegalArgumentException - if some property of this element prevents it from being added to this queue
    • poll

      public E poll()
      Retrieves and removes the head of this queue, or returns null if this queue is empty.
      Returns:
      the head of this queue, or null if this queue is empty
    • peek

      public E peek()
      Retrieves, but does not remove, the head of this queue, or returns null if this queue is empty.
      Returns:
      the head of this queue, or null if this queue is empty
    • getMemoryUsed

      public int getMemoryUsed()
      Gibt den Speicher zurück, den die Objekte im Arbeitsspeicher verwenden. Das ist nicht zwingend die Menge an Arbeitsspeicher, die wirklich verbraucht wird, sondern die Menge an Speicher, den die Objekte brauchen würden, wären sie in einer Datei serialisiert gespeichert. Dieser Wert kann kurzzeitig während des Einfügens von Objekten getMemoryCapacity() überschreiten.
      Returns:
      Menge an Speicher in Bytes
    • getMemoryCapacity

      public int getMemoryCapacity()
      Gibt die Kapazität des Caches in Bytes zurück, in dem die Objekte im Arbeitsspeicher gehalten werden. Das ist nicht zwingend die Menge an Arbeitsspeicher, die verbraucht wird, sondern die Menge an Speicher, den die Objekte brauchen würden, wären sie in einer Datei serialisiert gespeichert.
      Returns:
      Kapazität in Bytes
    • getDiskUsed

      public long getDiskUsed()
      Gibt den Festplattenplatz zurück, der von dieser Queue in Benutzung ist. Die Dateigröße kann aufgrund von Fragmentierung usw. größer sein.
      Returns:
      Größe in Bytes
    • getDiskCapacity

      public long getDiskCapacity()
      Gibt den maximal genutzen Festplattenplatz zurück, der von dieser Queue verwendet wird. Dieser Wert kann von getDiskUsed() um maximal eine Objektgröße überschritten werden.
      Returns:
      Größe in Bytes
    • clear

      public void clear()
      Removes all of the elements from this queue. The queue will be empty after this call returns.
      Specified by:
      clear in interface Collection<E>
      Overrides:
      clear in class AbstractQueue<E>
    • toString

      public String toString()
      Overrides:
      toString in class AbstractCollection<E>