Java EE Transaction Timeout unter Verwendung des JBoss WildFly erhöhen

Markus Kühle
coodoo
Published in
2 min readFeb 2, 2017

--

Es kommt immer wieder vor, dass Methoden länger benötigen als der darum liegende Transaktionsrahmen zulässt und man in einen Transaction Timeout läuft. Das kann zum Beispiel bei einem Import von Daten passieren oder bei größeren Berechnungen und Datenupdates.

Wie man damit bei Java EE 7 und mit dem JBoss WildFly lösen kann wird in diesem Artikel beschrieben.

Ist dies der Fall erscheint z.B. folgende Exception im Logfile: org.hibernate.HibernateException: Transaction was rolled back in a different thread, welche allerdings nur ein Folgefehler von dieser Meldung ist: [com.arjuna.ats.arjuna] (Transaction Reaper) [] [] ARJUNA012117: TransactionReaper::check timeout for TX

Im Logfile sieht das im Zusammenhang z.B. folgendermaßen aus:

Für das Problem existieren mehrere Lösungen.

  1. Den Aufruf in kleine brauchbare Stücke zerlegen, so dass nur kleine Transaktionen verwendet werden könne. Oft ist ein Transaktion Timeout auch ein Zeichen für schlechten Code.
  2. Generell den Transaktion Timeout für alle Transaktionen erhöhen.
  3. Individuell für eine bestimmte Transaktion den Timeout erhöhen.

Im folgenden schauen wir uns Lösung 2 und 3 an.

Exception Timeout generell im WildFly erhöhen

Der Standard Transactin Timeout beim JBoss WildFly liegt bei 300 Sekunden, was 5 Minuten sind. Diese Einstellung kann man in der Administrations Oberfläche über Submodules Transaction sehen:

Auf der Subsystem Transaction Detailseite sind alle Einstellungen zu den Transaktionen zu sehen, darunter auch der Timeout:

An dieser Stelle kann man global den Transaction Timeout für den WildFly erhöhen.

Individuelle Anpassung des Timeouts durch @TransactionTimeout Annotation

Möchte man den Standard Timeout nicht anpassen besteht die Möglichkeit für eine Transaktion ganz gezielt das Timeout hochzusetzen. Dazu hat JBoss eine @TransacationTimeout Annotation zur Verfügung gestellt, die über den Import org.jboss.ejb3.annotation.TransactionTimeout eingebunden wird.

Möchte man diese verwenden muss das ejb3-ext-api jar als Abhängigkeit mit in das Projekt genommen werden. Hier der Snippet für die pom.xml:

Sobald die Abhängigkeit eingebunden ist kann die Annotation sehr einfach an jeder Methode verwendet werden:

Wichtig: die Annotation greift nur wenn sie an der Stelle angegeben wird an der auch die Transaktion startet. In meinem Beispiel ist der REST Endpoint eine Stateless EJB und somit startet die Transaktion an dieser Methode.

--

--