public class ArchiveTask extends RepeatingTask
Task zur Archivierung von Datensätzen. 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.
Modifier and Type | Class and Description |
---|---|
static class |
ArchiveTask.CloseContainerObject
Eine Instanz dieser Klasse wird eingefuegt, wenn ein Container aufgrund einer Parametrierungs-Aenderung abgeschlossen werden soll.
|
Modifier and Type | Field and Description |
---|---|
protected java.util.concurrent.atomic.AtomicLong |
_closeCount |
protected java.util.concurrent.atomic.AtomicLong |
_failCount |
protected java.util.concurrent.atomic.AtomicLong |
_successCount |
protected ArchiveDataKind |
adk |
protected long |
arsTime |
protected long |
aspID |
protected AttributeGroup |
atg |
protected java.util.zip.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 java.lang.String |
didPath |
protected java.lang.String |
didPathA |
protected java.lang.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 java.lang.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 |
TERMINATE_TASK
_debug, _shouldTerminate, archMgr, didTree, INDEX_MEMORY_SIZE, persMgr
Constructor and Description |
---|
ArchiveTask(ArchiveManager archiveMgr,
int tskIdx,
ArchiveRingBuffer inQueue)
Konstruktor des Archiv-Tasks.
|
Modifier and Type | Method and Description |
---|---|
private void |
archiveData(java.lang.Object resultData,
long archTime) |
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.
|
long |
getCloseContainerSuccess() |
static ContainerSettings |
getContainerSettings()
Liefert die Container-Einstellungen des Archivsystems.
|
long |
getFailedCount() |
static long |
getLastArchiveTime() |
long |
getProcessedCount() |
long |
getSuccessCount() |
protected void |
handleErr(java.lang.Exception e,
ArchiveTask.CloseContainerObject cco) |
protected void |
handleErr(java.lang.Exception e,
java.lang.String corpusDelicti) |
private boolean |
handleIndexBackstep()
Prueft, ob der Datenindex plausibel ist und sendet ggf. die entsprechenden Betriebsmeldungen.
|
protected void |
handleSevereErr(java.lang.Throwable e,
java.lang.String corpusDelicti) |
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.
|
void |
resetDSCounter()
Setzt alle Zaehler auf 0.
|
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 für den angegebenen Datensatz.
|
static void |
setContainerSettings(ContainerSettings cs)
Setzt die Container-Einstellungen des Archivsystems.
|
static void |
setLastArchiveTime(long atime) |
void |
step() |
protected boolean |
storeData() |
void |
terminateTask()
Terminiert den Task, indem die
#run() -Methode unterbrochen wird, sofern sie im Wartezustand ist und nicht gerade einen Auftrag bearbeitet. |
protected boolean |
tooLargeForNewContainer()
Prueft extra auf ContainerGröße.
|
void |
work(java.lang.Object resultData,
long archTime)
Archiviert den uebergebenen Datensatz unter dem angegebenen Archivzeitstempel.
|
execute
addTaskStepListener, cleanUp, getArchMgr, getName, getObjectsFromDav, getState, isAlive, isTerminated, join, removeTaskStepListener, setName, shouldTerminate, start, suspendTaskIfNecessary, taskStepDone
protected static final boolean REQUESTED
protected static final boolean ONLINE
private static final ArchiveDataKind OA
private static final ArchiveDataKind ON
protected static final ArchiveDataKind NA
protected static final ArchiveDataKind NN
public static final java.lang.String MSG_PID_DATAINDEX_ANOMALY
Kennzeichen der Betriebsmeldung
protected final java.util.concurrent.atomic.AtomicLong _successCount
protected final java.util.concurrent.atomic.AtomicLong _failCount
protected final java.util.concurrent.atomic.AtomicLong _closeCount
protected byte[] idxBuffer
private ArchiveRingBuffer inputDataQueue
private ArchiveRingBuffer.PopObject popObject
private static long lastArchiveTime
Letzte verwendete Archivzeit. Wird für die Archivzeitueberwachung benutzt.
private ResultData rd
protected long objID
protected long aspID
protected long arsTime
protected long dataTime
protected long dataIdx
protected long openContID
protected AttributeGroup atg
protected int sv
protected ArchiveDataKind adk
protected java.lang.String didPath
protected java.lang.String didPathA
protected java.lang.String didPathN
protected DataIdentNode din
protected int dataEntryLen
Laenge des serislisierten Datensatzes inklusive Datensatz-Header
private long lastADataIdx
private long lastNDataIdx
private long lastDataIdx
private long lastDataTime
private long lastAContID
private boolean lastDataWasGapMarker
protected java.util.zip.Deflater compresser
private static ContainerSettings containerSettings
Container-Einstellungen des Archivsystems (aus atg.archivContainer).
public ArchiveTask(ArchiveManager archiveMgr, int tskIdx, ArchiveRingBuffer inQueue)
Konstruktor des Archiv-Tasks.
tMgr
- Task-ManagerpMgr
- Persistenz-Managerpublic static void setContainerSettings(ContainerSettings cs)
Setzt die Container-Einstellungen des Archivsystems.
cs
- Container-Einstellungenpublic static ContainerSettings getContainerSettings()
Liefert die Container-Einstellungen des Archivsystems.
public void step() throws java.lang.InterruptedException
step
in class RepeatingTask
java.lang.InterruptedException
public void terminateTask()
Task
Terminiert den Task, indem die #run()
-Methode unterbrochen wird, sofern sie im Wartezustand ist und nicht gerade einen Auftrag bearbeitet. Andernfalls wird der Task vor dem naechsten Zyklus beendet.
terminateTask
in class Task
public long getProcessedCount()
public long getSuccessCount()
public long getFailedCount()
public long getCloseContainerSuccess()
resetDSCounter()
erfolgreich verarbeiteten Close-Container-Datensätze. Kann zur Test-Synchronisation verwendet werden.public void resetDSCounter()
Setzt alle Zaehler auf 0.
public static void setLastArchiveTime(long atime)
public static long getLastArchiveTime()
protected void assignIndexes(boolean requested) throws DIdNodeNotFoundException, IndexException, PersistenceException
public void work(java.lang.Object resultData, long archTime)
Archiviert den uebergebenen Datensatz unter dem angegebenen Archivzeitstempel.
resultData
- ErgebnisdatensatzarchTime
- Archivzeitstempelprivate void archiveData(java.lang.Object resultData, long archTime)
protected boolean storeData() throws PersistenceException, IndexException
PersistenceException
IndexException
private void presetData(ResultData resultData, long archTime) throws DIdNodeNotFoundException
Setzt Flags, IDs, holt den DataIdentNode, usw.
resultData
- Aktueller ErgebnisdatensatzarchTime
- ArchivzeitstempelDIdNodeNotFoundException
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.
closeObjID
- cco
- 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.
PersistenceException
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.
IndexException
private boolean isDataGap() throws IndexException
Prueft, ob eine potentielle Datenluecke vorliegt. Der Aufrufer dieser Methode muss die Synchronisierung ueber den DataIdentNode durchfuehren.
IndexException
private boolean handleIndexBackstep() throws IndexException
Prueft, ob der Datenindex plausibel ist und sendet ggf. die entsprechenden Betriebsmeldungen. Prueft, ob der Datenindex kleiner, gleich oder Größer 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 Größer ist, wird normal archiviert.
IndexException
private void sendAck(ResultData rd)
Sendet eine Quittung für den angegebenen Datensatz.
rd
- Datensatzprotected void handleErr(java.lang.Exception e, java.lang.String corpusDelicti)
protected void handleErr(java.lang.Exception e, ArchiveTask.CloseContainerObject cco)
protected void handleSevereErr(java.lang.Throwable e, java.lang.String corpusDelicti)
protected void createRebuildIndexFlagFile() throws PersistenceException
Erzeugt die Kennzeichen-Datei, ob die Indexe veraendert wurden, um nach einem Absturz den Wiederanlauf zu beschleunigen.
PersistenceException
protected void logReceivedData(ResultData rd)
protected void logWriteData() throws IndexException
IndexException
protected void logNewContainer()
private void logDataGap()
protected void logManualCloseContainer(long closeObjID, ArchiveTask.CloseContainerObject cco)
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.
requested
- Wahr für nachgeforderte, falsch für aktuelle Daten.PersistenceException
IndexException
protected boolean tooLargeForNewContainer() throws PersistenceException
Prueft extra auf ContainerGröße. Damit kann verhindert werden, dass staendig neue Container angelegt werden, wenn bereits mit einem Datum die Größe ueberschritten wuerde. Stattdessen wird mit der maximal erlaubten Größe eine Fehlermeldung ausgegeben. Der Aufrufer dieser Methode muss die Synchronisierung ueber den DataIdentNode durchfuehren.
PersistenceException
private boolean checkCloseCondition(ContainerSettings.CloseCondition closeCond) throws PersistenceException, IndexException
Prueft ob der aktuelle Container die angegebenen Kriterien zum Container-Abschliessen erfuellt.
closeCond
- Container-Abschluss-kriterienPersistenceException
IndexException