2011-01-17 3 views
0

Ich bin mit jboss5.1.x, EJB3.0Schreiben auf Datenbankprotokoll in der Mitte des Rollbacks

Ich habe eine Transaktion, die so geht: MDB JMS Queue hören. MDB nimmt msg von JMS in Datenbank schreiben.

In einigen der catch-Klauseln wir werfen "New EJBException (..)", um Rollbacks zu haben, wenn bestimmte Ausnahmen auftreten.

daneben habe ich einen Re-try-Mechanismus konfiguriert, nach 3 mal die msg in die Fehlerwarteschlange gehen.

Was ich will achive ist:

wenn Iam ein Rollback mit, ich will die aktuelle Wiederholungszahl erhöhen, so dass, wenn some1 die Datenbank beobachtet, kann er/sie on-line die sehen können aktuelle Wiederversuchsnummer.

das Problem ist: wenn ich Rollback, so auch der „insert_number_of_retry“ query gerollt wird wieder selbst, die von mir verhindert die aktuelle Wiederholungsanzahl zu der Datenbank hinzuzufügen

wie kann ich dieses Problem lösen?

Danke,

ray.

Antwort

1

Sie können versuchen, Ihre Protokollierungsmethode in einer separaten Transaktion auszuführen, indem Sie sie mit @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) annotieren.

+0

NotSupported funktioniert auch. außer dass es in keiner Transaktion getan wird http://www.roseindia.net/javacertification/ibm-287/manipulate_transactional.shtml –

+0

Ich versuchte @TransactionAttribute (TransactionAttributeType.REQUIRES_NEW), es hat nicht funktioniert. Die Aktion wurde ebenfalls zurückgesetzt. – rayman

+0

es funktionierte nur, wenn ich es in einem separaten Thread einwickelte. – rayman

0

Sie benötigen eine separate Transaktion in einem separaten Thread (Sie können dedizierten Thread/Pool für oder spawnen Sie einen, falls erforderlich). Sie haben die Möglichkeit zu warten, bis der gegabelte TX endet oder verfällt (und einfach mit dem Rollback und dem schnellen Beenden fortfahren), was von der zusätzlichen Logik und so abhängt.

+0

Können Sie ein Beispiel zeigen? – rayman

+0

Ich kann später versuchen, seit Ewigkeiten kein EJB mehr gemacht, sondern stattdessen den Transaktionsmanager (arjuna) repariert haben, den jboss verwendet [es hat Threads Leck]. Eine weitere Option: Verwenden Sie den Wiederholungszähler NICHT in derselben Entität, Sie benötigen eine separate Entität mit einem Zähler und einer Referenz (und optional eine Sammlung von IDs der Erstanforderungen, die die Wiederholungen verursachen). – bestsss

Verwandte Themen