"Wiederherstellungsverhalten" bei Listen nach Systemabsturz

#1

Hallo,

sorry für den Titel, aber mir ist leider nichts besseres eingefallen.

Aber nun zu meinem Problem:
Ich bekomme über SOAP Anfragen übermittelt, welche ich in eine Messaging-Queue ablege. An dieser Queue gefällt mir, das nach einem Systemabsturz die noch enthaltenen Objekte automatisch wieder hergestellt werden.

Da ich sichergehen will, das die Objekte solange existieren, bis ich die Daten zu 100% verarbeitet habe, suche ich eine Liste, welche ein ähnliches Verhalten wie die Messaging-Queue aufweist.

Ich habe mir das so vorgestellt ,das ich ein Element aus der Queue entnehme und sofort in die “sichere” Liste überführe. Dann arbeite ich das Objekt ab und entferne das Objekt wieder aus der Liste. Danach ist der Lebenszyklus des Objektes beendet.

Falls es im Verlauf der Abarbeitung zu einem Systemabsturz kommt, aus welchen Gründen auch immer, soll mit Neustart des App-Servers die alte Liste mit den zuletzt aktiv bearbeiteten Objekten wiederher gestellt werden. Die Elemente der wiederhergestellten Liste würde ich dann wieder der Queue zuführen, damit die Verarbeitung erneut durchgeführt werden kann. Mir ist klar, das im Moment der Überführung von der Queue in die “sichere Liste” das Objekt dennoch bei einem Systemabstruz verlorgen gehen kann. Aber ich gehe davon aus, das es nur mit unverhältnismäßig großem Aufwand möglich ist, auch hier 100% Sicherheit zu erhalten.

Gibt es im Java EE Umfeld Listen, welche ein solches automatisches “Wiederherstellungsverhalten” unterstützen?

Danke für eure Hilfe!
Grüße Hans

#2

Vielleicht nicht genau das was du suchst, aber Apache MQ verhält sich ebenso.

#3

Hallo Crian,

danke für deine Antwort.

Der WildFly 15, welchen ich aktuell verwende, nutzt für die Messaging-Queue die Apache MQ.
Mein Problem ist, wenn ich eine Nachricht aus der Messaging-Queue entnehme und das Objekt verarbeite, ist diese Message nicht mehr in der Hoheit der Messaging-Queue und ist mit Systemabsturz verloren.

#4

Oder gibt es eine Möglichkeit, ein Element Thread-Sicher aus der Queue auszulesen, es zu sperren, abzuarbeiten und dann erst aus der Queue zu entnehmen?

#5

Ah ich verstehe. Ich kenne WildFly leider nicht. Ist denn der Teil, der die Nachricht aus Active-MQ übernimmt, unter deiner Kontrolle? Da Active-MQ das ja verlässlich hinbekommt, muss es zumindest Möglichkeiten geben, diese Techniken “weiter außen” selbst auch anzuwenden.

Von einer Möglichkeit, Elemente gesperrt zu entnehmen und erst hinterher freizugeben, weiß ich leider nichts. Aber danach ließe sich sicher googeln. Ich fürchte, es läuft dem Prinzip etwas entgegen, aber auf der anderen Seite werden andere Anwender ja das gleiche Problem einer zuverlässigen Abarbeitung JEDER Anfrage auch bereits gehabt haben. Vielleicht gibt es daher sowas doch?

#6

Sollte das nicht automatisch passieren, und Messages erst nach Acknowledgment wirklich aus der Queue entfernt werden?

https://javaee.github.io/tutorial/jms-concepts004.html#BNCFW

#7

Vielen dank für den Link. Ich muss das jetzt erst mal durcharbeiten und ausprobieren. Wenn ich es verstanden habe … hmmm oder auch nicht … melche ich mich hier zurück :wink:

#8

Hallo,

fast hätte ich vergessen mich zurück zu melden. Ich habe mir den Artikel, welchen mrBrown mir zur Verfügung gestellt hat durchgelesen und meinen Code entsprechend angepasst.

@mrBrown Danke noch mal für deinen Hinweis :slight_smile:


für alle die wie ich vor dem gleichen Problem stehen:
An sich ist das Ganze mega einfach.
Beim Erzeugen der Queue-Session muss einfach angegeben werden, das der Client das acknowledge durchführen soll myQueueConnection.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);
Final wird die Message aus der Queue entnommen, wenn von der Message die Methode acknowledge aufgerufen wird (myMessage.acknowledge();).
Fertig :wink:

1 Like
#9

Danke für die Rückmeldung, das ist interessant!