2016-07-11 29 views
1

Ich versuche, JTA mit Spring Boot zu aktivieren, so dass JPA und JMS zusammen zurückrollen. Alle Dokumente weisen auf http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-jta.html und es heißtMit Springboot, wie erkennt es eine JTA-Umgebung?

Wenn eine JTA-Umgebung erkannt wird, Spring JtaTransactionManager verwendet werden, um Transaktionen zu verwalten.

Was ist mit "JTA-Umgebung erkannt" gemeint?

Ich frage, weil ich denke, dass das ist, was mich stolpert. Ich fügte Abhängigkeiten für Atomikos hinzu, aber jmsTemplate.isSessionTransacted() gibt false zurück. Ich gehe davon aus, dass ich meine Umgebung nicht korrekt als JTA markiert habe. Ich laufe mit eingebetteten Tomcat.

Was ich erlebe, ist, dass die Datenbankänderungen mit der Transaktion rückgängig gemacht werden, nicht jedoch die JMS-Nachrichten.

UPDATE:

Der Teil über sessionTransacted wurde nicht verwendet. Es war mein Missverständnis.

Antwort

1

Eine JTA-Umgebung wird erkannt, wenn ein unterstützter Transaktionsmanager im Klassenpfad (Atomikos oder Bitronix in 1.3 und auch Narayana in 1.4) oder javax.transaction.TransactionManager in JNDI verfügbar ist (in der Regel, weil Sie Ihre Boot-App für ein Java EE Container).

Ich denke, Sie haben den Zweck der sessionTransacted Flagge auf JmsTemplate missverstanden. Es wird beim Erstellen einer neuen Sitzung verwendet (Connection.createSession), der Wert transacted, der an createSession übergeben wird, wird jedoch ignoriert, wenn Sie in einer JTA-Umgebung ausgeführt werden.

+0

Ein Mitarbeiter hat darauf hingewiesen, was Sie über 'SessionTransacted' gesagt haben, also war das ein Ablenkungsmanöver. Die JMS-Nachricht wird gesendet, wenn die Transaktion zurückgesetzt wird. – pgreen2

1

Sie können es in der Klasse sehen org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration:

@ConditionalOnClass(javax.transaction.Transaction.class) 
@ConditionalOnProperty(prefix = "spring.jta", value = "enabled", matchIfMissing = true) 
@AutoConfigureBefore({ XADataSourceAutoConfiguration.class, 
     ActiveMQAutoConfiguration.class, HornetQAutoConfiguration.class, 
     HibernateJpaAutoConfiguration.class }) 
@Import({ JndiJtaConfiguration.class, BitronixJtaConfiguration.class, 
     AtomikosJtaConfiguration.class, NarayanaJtaConfiguration.class }) 
@EnableConfigurationProperties(JtaProperties.class) 
public class JtaAutoConfiguration { 

} 

Grundsätzlich muss man auf dem Classpath die JTA API haben, und mindestens ein JTA-Provider (Bitronix oder Atomikos, wenn Sie nicht eine Verwendung Anwendungsserver).