de.bsvrz.ars.ars.mgmt.tasks
Class ArchiveTask

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.ArchiveTask
All Implemented Interfaces:
SuspendableTask, Runnable
Direct Known Subclasses:
ArchiveRequestedTask

public class ArchiveTask
extends Task

Task zur Archivierung von Datensaetzen. Ist nicht von SingleTask abgeleitet, weil ein spezieller ArchiveRingBuffer verwendet wird, der zwei Objekte (ResultData und Archivzeit) speichern kann. Die work()-Methode hat deswegen zwei Parameter.

Author:
beck et al. projects GmbH, Alexander Schmidt

Nested Class Summary
static class ArchiveTask.CloseContainerObject
          Eine Instanz dieser Klasse wird eingefuegt, wenn ein Container aufgrund einer Parametrierungs-Aenderung abgeschlossen werden soll.
 
Nested classes/interfaces inherited from class java.lang.Thread
Thread.State, Thread.UncaughtExceptionHandler
 
Field Summary
protected  ArchiveDataKind adk
           
protected  long arsTime
           
protected  long aspID
           
protected  AttributeGroup atg
           
private static AtomicLong CLOSE_CONT_SUCCESS
           
protected  Deflater compresser
           
private static ContainerSettings containerSettings
          Container-Einstellungen des Archivsystems (aus atg.archivContainer).
protected  int dataEntryLen
          Laenge des serislisierten Datensatzes inklusive Datensatz-Header
protected  long dataIdx
           
protected  long dataTime
           
protected  String didPath
           
protected  String didPathA
           
protected  String didPathN
           
protected  DataIdentNode din
           
protected  byte[] idxBuffer
           
private  ArchiveRingBuffer inputDataQueue
           
private  long lastAContID
           
private  long lastADataIdx
           
private static long lastArchiveTime
          Letzte verwendete Archivzeit.
private  long lastDataIdx
           
private  long lastDataTime
           
private  boolean lastDataWasGapMarker
           
private  long lastNDataIdx
           
static String MSG_PID_DATAINDEX_ANOMALY
          Kennzeichen der Betriebsmeldung
protected static ArchiveDataKind NA
           
protected static ArchiveDataKind NN
           
private static ArchiveDataKind OA
           
protected  long objID
           
private static ArchiveDataKind ON
           
protected static boolean ONLINE
           
protected  long openContID
           
private  ArchiveRingBuffer.PopObject popObject
           
private  ResultData rd
           
protected static boolean REQUESTED
           
protected  int sv
           
private static AtomicLong TOTAL_DS_FAIL
           
private static AtomicLong TOTAL_DS_QUEUED
           
private static AtomicLong TOTAL_DS_SUCCESS
           
 
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
 
Constructor Summary
ArchiveTask(ArchiveManager archiveMgr, RingOfDeathListener rodl, int tskIdx, ArchiveRingBuffer inQueue)
          Konstruktor des Archiv-Tasks.
 
Method Summary
protected  void assignIndexes(boolean requested)
           
private  boolean checkCloseCondition(ContainerSettings.CloseCondition closeCond)
          Prueft ob der aktuelle Container die angegebenen Kriterien zum Container-Abschliessen erfuellt.
private  void closeContainer(long closeObjID, ArchiveTask.CloseContainerObject cco)
          Schliesst einen Container ab.
protected  void createRebuildIndexFlagFile()
          Erzeugt die Kennzeichen-Datei, ob die Indexe veraendert wurden, um nach einem Absturz den Wiederanlauf zu beschleunigen.
static long getCloseContainerSuccess()
           
static ContainerSettings getContainerSettings()
          Liefert die Container-Einstellungen des Archivsystems.
static long getLastArchiveTime()
           
static long getTotalDS_Fail()
           
static long getTotalDS_Processed()
           
static long getTotalDS_Queued()
           
static long getTotalDS_Success()
           
protected  void handleErr(Exception e, ArchiveTask.CloseContainerObject cco)
           
protected  void handleErr(Exception e, String corpusDelicti)
           
private  boolean handleIndexBackstep()
          Prueft, ob der Datenindex plausibel ist und sendet ggf.
protected  void handleSevereErr(Throwable e, String corpusDelicti)
           
static void incrementTotalDS_Queued()
          Wird vom InQueuesMgr.ArchiveDataReceiver aufgerufen, nachdem er einen zu archivierenden Datensatz in eine der Queues gelegt hat.
private  boolean isDataGap()
          Prueft, ob eine potentielle Datenluecke vorliegt.
private  void logDataGap()
           
protected  void logManualCloseContainer(long closeObjID, ArchiveTask.CloseContainerObject cco)
           
protected  void logNewContainer()
           
protected  void logReceivedData(ResultData rd)
           
protected  void logWriteData()
           
protected  void lookupLastDataIdxes(boolean requested)
          Sucht die letzten Datenindexe im Index sowie den Container aus dem .
protected  boolean mustCloseContainer(boolean requested)
          Prueft ob ein Container abgeschlossen werden muss.
private  void presetData(ResultData resultData, long archTime)
          Setzt Flags, IDs, holt den DataIdentNode, usw.
static void resetDSCounter()
          Setzt alle Zaehler auf 0.
 void run()
           
private  boolean scanOAContForLastNoSrc()
          Durchlaeuft den aktuellen Container und prueft, ob der letzte Datensatz die Kennung "keine Quelle" hat (langsam!).
private  void sendAck(ResultData rd)
          Sendet eine Quittung fuer den angegebenen Datensatz.
static void setContainerSettings(ContainerSettings cs)
          Setzt die Container-Einstellungen des Archivsystems.
static void setLastArchiveTime(long atime)
           
protected  boolean storeData()
           
protected  boolean tooLargeForNewContainer()
          Prueft extra auf Containergroesse.
 void work(Object resultData, long archTime)
          Archiviert den uebergebenen Datensatz unter dem angegebenen Archivzeitstempel.
 
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

REQUESTED

protected static final boolean REQUESTED
See Also:
Constant Field Values

ONLINE

protected static final boolean ONLINE
See Also:
Constant Field Values

OA

private static final ArchiveDataKind OA

ON

private static final ArchiveDataKind ON

NA

protected static final ArchiveDataKind NA

NN

protected static final ArchiveDataKind NN

MSG_PID_DATAINDEX_ANOMALY

public static final String MSG_PID_DATAINDEX_ANOMALY
Kennzeichen der Betriebsmeldung

See Also:
Constant Field Values

TOTAL_DS_QUEUED

private static AtomicLong TOTAL_DS_QUEUED

TOTAL_DS_SUCCESS

private static AtomicLong TOTAL_DS_SUCCESS

TOTAL_DS_FAIL

private static AtomicLong TOTAL_DS_FAIL

CLOSE_CONT_SUCCESS

private static AtomicLong CLOSE_CONT_SUCCESS

idxBuffer

protected byte[] idxBuffer

inputDataQueue

private ArchiveRingBuffer inputDataQueue

popObject

private ArchiveRingBuffer.PopObject popObject

lastArchiveTime

private static long lastArchiveTime
Letzte verwendete Archivzeit. Wird fuer die Archivzeitueberwachung benutzt.


rd

private ResultData rd

objID

protected long objID

aspID

protected long aspID

arsTime

protected long arsTime

dataTime

protected long dataTime

dataIdx

protected long dataIdx

openContID

protected long openContID

atg

protected AttributeGroup atg

sv

protected int sv

adk

protected ArchiveDataKind adk

didPath

protected String didPath

didPathA

protected String didPathA

didPathN

protected String didPathN

din

protected DataIdentNode din

dataEntryLen

protected int dataEntryLen
Laenge des serislisierten Datensatzes inklusive Datensatz-Header


lastADataIdx

private long lastADataIdx

lastNDataIdx

private long lastNDataIdx

lastDataIdx

private long lastDataIdx

lastDataTime

private long lastDataTime

lastAContID

private long lastAContID

lastDataWasGapMarker

private boolean lastDataWasGapMarker

compresser

protected Deflater compresser

containerSettings

private static ContainerSettings containerSettings
Container-Einstellungen des Archivsystems (aus atg.archivContainer).

Constructor Detail

ArchiveTask

public ArchiveTask(ArchiveManager archiveMgr,
                   RingOfDeathListener rodl,
                   int tskIdx,
                   ArchiveRingBuffer inQueue)
Konstruktor des Archiv-Tasks.

Parameters:
tMgr - Task-Manager
pMgr - Persistenz-Manager
Method Detail

setContainerSettings

public static void setContainerSettings(ContainerSettings cs)
Setzt die Container-Einstellungen des Archivsystems.

Parameters:
cs - Container-Einstellungen

getContainerSettings

public static ContainerSettings getContainerSettings()
Liefert die Container-Einstellungen des Archivsystems.

Returns:
Container-Einstellungen

run

public void run()
Specified by:
run in interface Runnable
Overrides:
run in class Thread

incrementTotalDS_Queued

public static void incrementTotalDS_Queued()
Wird vom InQueuesMgr.ArchiveDataReceiver aufgerufen, nachdem er einen zu archivierenden Datensatz in eine der Queues gelegt hat.


getTotalDS_Queued

public static long getTotalDS_Queued()
Returns:
Anzahl der seit Systemstart in die Warteschlangen eingefuegten zu archivierenden Datensatze

getTotalDS_Processed

public static long getTotalDS_Processed()
Returns:
Anzahl der seit Systemstart zur Archivierung verarbeiteten Datesaetze (erfolgreich und nicht erfolgreich archiviert)

getTotalDS_Success

public static long getTotalDS_Success()
Returns:
Anzahl der seit Systemstart erfolgreich archivierten Datesaetze

getTotalDS_Fail

public static long getTotalDS_Fail()
Returns:
Anzahl der seit Systemstart nicht erfolgreich archivierten Datesaetze

getCloseContainerSuccess

public static long getCloseContainerSuccess()
Returns:
Zahl aller seit dem Start oder letzten resetDSCounter() erfolgreich verarbeiteten Close-Container-Datensaetze. Kann zur Test-Synchronisation verwendet werden.

resetDSCounter

public static void resetDSCounter()
Setzt alle Zaehler auf 0.


setLastArchiveTime

public static void setLastArchiveTime(long atime)

getLastArchiveTime

public static long getLastArchiveTime()

assignIndexes

protected void assignIndexes(boolean requested)
                      throws DIdNodeNotFoundException,
                             IndexException,
                             PersistenceException
Throws:
DIdNodeNotFoundException
IndexException
PersistenceException

work

public void work(Object resultData,
                 long archTime)
Archiviert den uebergebenen Datensatz unter dem angegebenen Archivzeitstempel.

Parameters:
resultData - Ergebnisdatensatz
archTime - Archivzeitstempel

storeData

protected boolean storeData()
                     throws PersistenceException,
                            IndexException
Throws:
PersistenceException
IndexException

presetData

private void presetData(ResultData resultData,
                        long archTime)
                 throws DIdNodeNotFoundException
Setzt Flags, IDs, holt den DataIdentNode, usw.

Parameters:
resultData - Aktueller Ergebnisdatensatz
archTime - Archivzeitstempel
Throws:
DIdNodeNotFoundException

closeContainer

private void closeContainer(long closeObjID,
                            ArchiveTask.CloseContainerObject cco)
Schliesst einen Container ab. Wird durch ein spezielles Objekt ausgeloest, das in die Queue der ArchiveTask gelegt wird. Um Platz zu sparen, wird anstelle der Archivzeit die Objekt-ID gespeichert. Der Aufrufer dieser Methode muss die Synchronisierung ueber den DataIdentNode durchfuehren.

Parameters:
closeObjID -
cco -

scanOAContForLastNoSrc

private boolean scanOAContForLastNoSrc()
                                throws PersistenceException
Durchlaeuft den aktuellen Container und prueft, ob der letzte Datensatz die Kennung "keine Quelle" hat (langsam!). Dies ist nur notwendig, wenn das erste mal auf die DID zugegriffen wird. Sonst genuegt DataIdentNode#lastOADataWasNoSource. Der Aufrufer dieser Methode muss die Synchronisierung ueber den DataIdentNode durchfuehren.

Returns:
Wahr, falls der letzte Datensatz die Kennung "keine Quelle" hat, falsch sonst
Throws:
PersistenceException

lookupLastDataIdxes

protected void lookupLastDataIdxes(boolean requested)
                            throws IndexException
Sucht die letzten Datenindexe im Index sowie den Container aus dem . Der Aufrufer dieser Methode muss die Synchronisierung ueber den DataIdentNode durchfuehren.

Throws:
IndexException

isDataGap

private boolean isDataGap()
                   throws IndexException
Prueft, ob eine potentielle Datenluecke vorliegt. Der Aufrufer dieser Methode muss die Synchronisierung ueber den DataIdentNode durchfuehren.

Returns:
Wahr, falls eine potentielle Datenluecke vorliegt, falsch sonst.
Throws:
IndexException

handleIndexBackstep

private boolean handleIndexBackstep()
                             throws IndexException
Prueft, ob der Datenindex plausibel ist und sendet ggf. die entsprechenden Betriebsmeldungen. Prueft, ob der Datenindex kleiner, gleich oder groesser als der zuletzt archivierte DI ist. Wenn der DI kleiner ist, wird eine BetrMeld verschickt und nichts archiviert. Wenn der DI gleich ist und dies der erste DS nach einer Neuanmeldung ist, wird der DS ignoriert (weil der DAV moeglicherweise einen gepufferten DS geschickt hat). Wenn der DI groesser ist, wird normal archiviert.

Returns:
Wahr, falls der Index nicht plausibel ist und der Datensatz nicht archiviert werden darf, falsch sonst.
Throws:
IndexException

sendAck

private void sendAck(ResultData rd)
Sendet eine Quittung fuer den angegebenen Datensatz.

Parameters:
rd - Datensatz

handleErr

protected void handleErr(Exception e,
                         String corpusDelicti)

handleErr

protected void handleErr(Exception e,
                         ArchiveTask.CloseContainerObject cco)

handleSevereErr

protected void handleSevereErr(Throwable e,
                               String corpusDelicti)

createRebuildIndexFlagFile

protected void createRebuildIndexFlagFile()
                                   throws PersistenceException
Erzeugt die Kennzeichen-Datei, ob die Indexe veraendert wurden, um nach einem Absturz den Wiederanlauf zu beschleunigen.

Throws:
PersistenceException

logReceivedData

protected void logReceivedData(ResultData rd)

logWriteData

protected void logWriteData()
                     throws IndexException
Throws:
IndexException

logNewContainer

protected void logNewContainer()

logDataGap

private void logDataGap()

logManualCloseContainer

protected void logManualCloseContainer(long closeObjID,
                                       ArchiveTask.CloseContainerObject cco)

mustCloseContainer

protected boolean mustCloseContainer(boolean requested)
                              throws PersistenceException,
                                     IndexException
Prueft ob ein Container abgeschlossen werden muss. Die Pruefung basiert auf containerSettings und dem mit de.bsvrz.ars.ars.persistence.PersistenceManager#accessContainer() im Zugriff befindlichen Daten. Der Aufrufer dieser Methode muss die Synchronisierung ueber den DataIdentNode durchfuehren.

Parameters:
requested - Wahr fuer nachgeforderte, falsch fuer aktuelle Daten.
Returns:
Wahr, falls Container abgeschlossen werden muss, falsch sonst.
Throws:
PersistenceException
IndexException

tooLargeForNewContainer

protected boolean tooLargeForNewContainer()
                                   throws PersistenceException
Prueft extra auf Containergroesse. Damit kann verhindert werden, dass staendig neue Container angelegt werden, wenn bereits mit einem Datum die Groesse ueberschritten wuerde. Stattdessen wird mit der maximal erlaubten Groesse eine Fehlermeldung ausgegeben. Der Aufrufer dieser Methode muss die Synchronisierung ueber den DataIdentNode durchfuehren.

Returns:
wahr, falls die maximale Containergroesse ueberschritten ist, falsch sonst
Throws:
PersistenceException

checkCloseCondition

private boolean checkCloseCondition(ContainerSettings.CloseCondition closeCond)
                             throws PersistenceException,
                                    IndexException
Prueft ob der aktuelle Container die angegebenen Kriterien zum Container-Abschliessen erfuellt.

Parameters:
closeCond - Container-Abschluss-kriterien
Returns:
Wahr, wenn der Container abgeschlossen werden muss, falsch sonst.
Throws:
PersistenceException
IndexException