de.bsvrz.ars.ars.mgmt.tasks
Class ArchiveQueryTask

java.lang.Object
  extended by java.lang.Thread
      extended by de.bsvrz.ars.ars.mgmt.tasks.Task
          extended by de.bsvrz.ars.ars.mgmt.tasks.MultiTask
              extended by de.bsvrz.ars.ars.mgmt.tasks.QueryTask
                  extended by de.bsvrz.ars.ars.mgmt.tasks.ArchiveQueryTask
All Implemented Interfaces:
SuspendableTask, ClientSenderInterface, StreamMultiplexerDirector, Runnable

public class ArchiveQueryTask
extends QueryTask
implements StreamMultiplexerDirector

Task fuer Bearbeitung von Archivanfragen.

Die Archivanfrage wird analysiert und in ihre Unterabfragen ArchiveQueryTask.Query zerlegt. Die Beantwortung erfolgt streambasiert mit einem Stream pro Unterabfrage.

Author:
beck et al. projects GmbH, Thomas Schäfer, Alexander Schmidt

Nested Class Summary
private  class ArchiveQueryTask.Container
          Diese Klasse kapselt alle notwendigen Informationen zu einem Ergebnis-Datencontainer.
private  class ArchiveQueryTask.ContWalk
          Im Container-Walk werden alle Container einer Datensatzart gesammelt, die zur Beantwortung einer Unterabfrage (@link Query} benoetigt werden, da sie Ergebnisdatensaetze enthalten.
private  class ArchiveQueryTask.Info
           
private  class ArchiveQueryTask.Query
          Klasse, die eine einzelne Unterabfrage (ArchiveDataSpecification) aus der Archivanfrage und die zugehoerigen Daten fuer die Archivantwort kapselt.
private  class ArchiveQueryTask.SimpleArchiveData
          Klasse, die einen Archivdatensatz mit den zugehoerigen Zeitstempeln und Datenindex kapselt.
 
Nested classes/interfaces inherited from class de.bsvrz.ars.ars.mgmt.tasks.QueryTask
QueryTask.SendingState
 
Nested classes/interfaces inherited from class java.lang.Thread
Thread.State, Thread.UncaughtExceptionHandler
 
Field Summary
private static int BLOCKING_FACTOR_MUX_DEFAULT
          Default-Anzahl der Pakete, die pro Stream initial an den Empfaenger geschickt werden duerfen.
private static int blockingFactorMuxParam
          Parametrierte Anzahl der Pakete, die pro Stream an den Empfaenger geschickt werden duerfen.
private  int blockingFactorMuxUsed
          Tatsaechlich benutzte Anzahl der Pakete, die pro Stream an den Empfaenger geschickt werden, angepasst an die Groesse des Empfaengerpuffers.
private static int BUFFER_SIZE_MUX_DEFAULT
          Default-Groesse des Puffers im Stream-Multiplexer.
private static int bufferSizeMuxParam
          Parametrierte Groesse des Puffers im Stream-Multiplexer.
private  int bufferSizeMuxUsed
          Tatsaechlich benutzte Groesse des Puffers im Stream-Multiplexer, angepasst an die Groesse des Empfaengerpuffers.
private  Inflater decompresser
          Zum Dekomprimieren.
private  FlowControlTask flowCtrl
          Task zur Verarbeitung der Flusskontroll-Steuerungspakete.
private  boolean initialResponseSent
          Wurde die initiale Antwort (kann auch Fehlermeldung sein) verschickt?
static int MAXIMUM_REQUESTS_PER_APPLICATION
          Maximale Anzahl paralleler Archivanfragen je Applikation
private  StreamMultiplexer mux
          Der StreamMultiplexer zum Verpacken der Ergebnis-Datensaetze.
private  List<ArchiveQueryTask.Query> queries
          Liste der einzelnen Unterabfragen aus der aktuellen Archivanfrage.
private  int receiverBufferSize
          Groesse des Empfangspuffers der anfragenden Applikation.
 
Fields inherited from class de.bsvrz.ars.ars.mgmt.tasks.QueryTask
atgQuery, bosResult, ddResponse, deserializer, gData, gResultData, MIN_CONTAINER_FILES, NA, NN, OA, ON, queryAppObj, queryIdx, sendingState, serializer, serializerVersion, syncObj, t_lsMax, tempMem
 
Fields inherited from class de.bsvrz.ars.ars.mgmt.tasks.MultiTask
resultData, taskMgr
 
Fields inherited from class de.bsvrz.ars.ars.mgmt.tasks.Task
archMgr, didTree, INDEX_MEMORY_SIZE, isTerminated, logger, persMgr, ringOfDeathListener, taskStepListeners
 
Fields inherited from class java.lang.Thread
MAX_PRIORITY, MIN_PRIORITY, NORM_PRIORITY
 
Fields inherited from interface de.bsvrz.dav.daf.main.ClientSenderInterface
START_SENDING, STOP_SENDING, STOP_SENDING_NO_RIGHTS, STOP_SENDING_NOT_A_VALID_SUBSCRIPTION
 
Constructor Summary
ArchiveQueryTask(ArchiveManager archiveMgr, MultiTaskManager tMgr, FlowControlTask flowCtrl)
          Erzeugt eine neue Query-Task.
 
Method Summary
private  void abortQueries()
          Markiert alle Unterabfragen als erledigt und schliesst alle noch offenen Datensatz-Iteratoren und Container.
private  void analyze()
          Analysiert die aktuelle Archivanfrage und fuellt die Liste der ArchiveQueryTask.Query.
private  void configureMuxParameter()
          Bestimmt die Parameter bufferSizeStreamMultiplexer und blockingFactor, mit denen der StreamMultiplexer per Konstruktor parametriert wird, anhand der Werte aus den Archivsystem-Einstellungen und dem tatsaechlich vorhandenen Empfangspuffer des Empfaengers.
 void dataRequest(SystemObject object, DataDescription dataDescription, byte state)
           
static int getBlockingFactorMux()
           
static int getBufferSizeMux()
           
private  int getIntervalErrorQueryIdx()
          Liefert den Index der Query, bei der die angefragten Intervallgrenzen vertauscht sind.
protected  void init()
          Initialisiert den Task fuer eine neue Archivanfrage.
 void sendData(byte[] streamDataPacket)
           
private  void sendInitialResponse(boolean success, String errorMsg)
          Sendet die initiale Ergebnismeldung zur Archiv-Anfrage an das Empfaenger-Applikations-Objekt.
static void setBlockingFactorMux(int bFMuxParam)
          Ueber diese Methode kann die Parametrierung den Blocking-Faktor des StreamMultiplexers auf den parametrierten Wert setzen (Attribut "AnzahlBlocks" in Attributgruppe "ArchivEinstellung").
static void setBufferSizeMux(int bSMuxParam)
          Ueber diese Methode kann die Parametrierung die Puffergroesse des StreamMultiplexers auf den parametrierten Wert setzen (Attribut "AnzahlBytes" in Attributgruppe "ArchivEinstellung").
 void streamAborted(int indexOfStream)
           
static void subscribeObjects(ArchiveManager archMgr, InQueuesMgr.DataReceiver receiver)
          Fuehrt alle notwendigen Anmeldungen durch.
 byte[] take(int indexOfStream)
           
protected  void unsubscribeSender()
          Meldet den Task als Sender fuer Archiv-Antworten an das angegebene Empfaenger-Applikations-Objekt ab.
 void work()
          Diese Methode ist zu überschreiben, um die konkrete Aufgabe der Task zu implementieren.
 
Methods inherited from class de.bsvrz.ars.ars.mgmt.tasks.QueryTask
createQueryData, getObjectsFromDAV, isRequestSupported, parseArchiveDataSpec, sendResultData, setT_lsMax, subscribeSender
 
Methods inherited from class de.bsvrz.ars.ars.mgmt.tasks.MultiTask
doWork, getTaskIndex, run, setTaskIndex
 
Methods inherited from class de.bsvrz.ars.ars.mgmt.tasks.Task
addTaskStepListener, getArchMgr, isTaskTerminated, removeTaskStepListener, suspendTaskIfNecessary, terminateTask
 
Methods inherited from class java.lang.Thread
activeCount, checkAccess, clone, countStackFrames, currentThread, destroy, dumpStack, enumerate, getAllStackTraces, getContextClassLoader, getDefaultUncaughtExceptionHandler, getId, getName, getPriority, getStackTrace, getState, getThreadGroup, getUncaughtExceptionHandler, holdsLock, interrupt, interrupted, isAlive, isDaemon, isInterrupted, join, join, join, resume, setContextClassLoader, setDaemon, setDefaultUncaughtExceptionHandler, setName, setPriority, setUncaughtExceptionHandler, sleep, sleep, start, stop, stop, suspend, toString, yield
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

BLOCKING_FACTOR_MUX_DEFAULT

private static final int BLOCKING_FACTOR_MUX_DEFAULT
Default-Anzahl der Pakete, die pro Stream initial an den Empfaenger geschickt werden duerfen. Wert laut Datenkatalog.

See Also:
Constant Field Values

blockingFactorMuxParam

private static int blockingFactorMuxParam
Parametrierte Anzahl der Pakete, die pro Stream an den Empfaenger geschickt werden duerfen.


blockingFactorMuxUsed

private int blockingFactorMuxUsed
Tatsaechlich benutzte Anzahl der Pakete, die pro Stream an den Empfaenger geschickt werden, angepasst an die Groesse des Empfaengerpuffers.


BUFFER_SIZE_MUX_DEFAULT

private static final int BUFFER_SIZE_MUX_DEFAULT
Default-Groesse des Puffers im Stream-Multiplexer. Wert laut Datenkatalog.

See Also:
Constant Field Values

bufferSizeMuxParam

private static int bufferSizeMuxParam
Parametrierte Groesse des Puffers im Stream-Multiplexer.


bufferSizeMuxUsed

private int bufferSizeMuxUsed
Tatsaechlich benutzte Groesse des Puffers im Stream-Multiplexer, angepasst an die Groesse des Empfaengerpuffers.


mux

private StreamMultiplexer mux
Der StreamMultiplexer zum Verpacken der Ergebnis-Datensaetze.


flowCtrl

private FlowControlTask flowCtrl
Task zur Verarbeitung der Flusskontroll-Steuerungspakete.


queries

private List<ArchiveQueryTask.Query> queries
Liste der einzelnen Unterabfragen aus der aktuellen Archivanfrage.


receiverBufferSize

private int receiverBufferSize
Groesse des Empfangspuffers der anfragenden Applikation.


initialResponseSent

private boolean initialResponseSent
Wurde die initiale Antwort (kann auch Fehlermeldung sein) verschickt?


decompresser

private Inflater decompresser
Zum Dekomprimieren. Wird hier gahalten, damit sowenig Instanzen wie moeglich angelegt werden (hoher Speicherverbrauch)


MAXIMUM_REQUESTS_PER_APPLICATION

public static final int MAXIMUM_REQUESTS_PER_APPLICATION
Maximale Anzahl paralleler Archivanfragen je Applikation

See Also:
Constant Field Values
Constructor Detail

ArchiveQueryTask

public ArchiveQueryTask(ArchiveManager archiveMgr,
                        MultiTaskManager tMgr,
                        FlowControlTask flowCtrl)
Erzeugt eine neue Query-Task.

Parameters:
archiveMgr - Archiv-Verwaltung
tMgr - Zugeordneter Task-Manager
flowCtrl - Verwaltung der Flusskontrolle
Method Detail

subscribeObjects

public static void subscribeObjects(ArchiveManager archMgr,
                                    InQueuesMgr.DataReceiver receiver)
Fuehrt alle notwendigen Anmeldungen durch.

Parameters:
archMgr - Archiv-Verwaltung
receiver - Empfaengerobjekt

setBlockingFactorMux

public static void setBlockingFactorMux(int bFMuxParam)
Ueber diese Methode kann die Parametrierung den Blocking-Faktor des StreamMultiplexers auf den parametrierten Wert setzen (Attribut "AnzahlBlocks" in Attributgruppe "ArchivEinstellung").

Parameters:
bFMuxParam - Parametrierter Blocking-Faktor des StreamMultiplexers

setBufferSizeMux

public static void setBufferSizeMux(int bSMuxParam)
Ueber diese Methode kann die Parametrierung die Puffergroesse des StreamMultiplexers auf den parametrierten Wert setzen (Attribut "AnzahlBytes" in Attributgruppe "ArchivEinstellung").

Parameters:
bSMuxParam - Parametrierte Puffergroesse des StreamMultiplexers

getBlockingFactorMux

public static int getBlockingFactorMux()
See Also:
setBlockingFactorMux(int)

getBufferSizeMux

public static int getBufferSizeMux()
See Also:
setBlockingFactorMux(int)

work

public void work()
Description copied from class: MultiTask
Diese Methode ist zu überschreiben, um die konkrete Aufgabe der Task zu implementieren. In der Methode soll keine weitere Synchronisation stattfinden.

Specified by:
work in class MultiTask
See Also:
MultiTask.work()

sendData

public void sendData(byte[] streamDataPacket)
Specified by:
sendData in interface StreamMultiplexerDirector
See Also:
StreamMultiplexerDirector.sendData(byte[])

take

public byte[] take(int indexOfStream)
Specified by:
take in interface StreamMultiplexerDirector
See Also:
StreamMultiplexerDirector.take(int)

streamAborted

public void streamAborted(int indexOfStream)
Specified by:
streamAborted in interface StreamMultiplexerDirector
See Also:
StreamMultiplexerDirector.streamAborted(int)

dataRequest

public void dataRequest(SystemObject object,
                        DataDescription dataDescription,
                        byte state)
Specified by:
dataRequest in interface ClientSenderInterface
Overrides:
dataRequest in class QueryTask
See Also:
ClientSenderInterface.dataRequest(SystemObject, DataDescription, byte)

init

protected void init()
Initialisiert den Task fuer eine neue Archivanfrage.

Overrides:
init in class QueryTask

analyze

private void analyze()
              throws NoSuchVersionException,
                     IOException,
                     PersistenceException,
                     IndexException
Analysiert die aktuelle Archivanfrage und fuellt die Liste der ArchiveQueryTask.Query.

Throws:
NoSuchVersionException
IOException
NoSuchVersionException
IOException
IndexException
PersistenceException
IndexException
PersistenceException

unsubscribeSender

protected void unsubscribeSender()
Meldet den Task als Sender fuer Archiv-Antworten an das angegebene Empfaenger-Applikations-Objekt ab. Deregistriert den StreamMultiplexer fuer den Empfang von Flusskontroll-Steuerungspaketen.

Overrides:
unsubscribeSender in class QueryTask

sendInitialResponse

private void sendInitialResponse(boolean success,
                                 String errorMsg)
                          throws IOException
Sendet die initiale Ergebnismeldung zur Archiv-Anfrage an das Empfaenger-Applikations-Objekt.

Parameters:
success - Anfrage erfolgreich
errorMsg - Fehlermeldung bei Misserfolg
Throws:
IOException

abortQueries

private void abortQueries()
Markiert alle Unterabfragen als erledigt und schliesst alle noch offenen Datensatz-Iteratoren und Container.


getIntervalErrorQueryIdx

private int getIntervalErrorQueryIdx()
Liefert den Index der Query, bei der die angefragten Intervallgrenzen vertauscht sind.

Returns:
Index der Query mit Fehler, -1 wenn alle Queries okay sind.

configureMuxParameter

private void configureMuxParameter()
Bestimmt die Parameter bufferSizeStreamMultiplexer und blockingFactor, mit denen der StreamMultiplexer per Konstruktor parametriert wird, anhand der Werte aus den Archivsystem-Einstellungen und dem tatsaechlich vorhandenen Empfangspuffer des Empfaengers.