2016-07-11 44 views
1

我試圖啓用彈簧啓動JTA,以便JPA和JMS將一起回滾。所有文檔指向http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-jta.html並指出使用彈簧啓動,它如何檢測JTA環境?

當檢測到JTA環境中,Spring的JtaTransactionManager 將用於管理事務。

什麼意思是「檢測到JTA環境」?

我問,因爲我認爲這是什麼讓我絆倒。我添加了對Atomikos 的依賴關係,但是jmsTemplate.isSessionTransacted()返回false。我假設我沒有正確標記我的環境爲JTA。我正在運行嵌入式tomcat。

我正在經歷的是數據庫更改正在回滾事務,但不是JMS消息。

UPDATE:

sessionTransacted的部分是沒有關係的。這是我的誤解。

回答

1

當支持的事務管理器位於類路徑中時(在1.3中爲Atomikos或Bitronix,在1.4中爲Narayana)或因爲JNDI中有javax.transaction.TransactionManager可用,所以會檢測到JTA環境(通常是因爲您已將您的Boot應用程序部署到一個Java EE容器)。

我想你已經誤解了sessionTransacted標誌的用途JmsTemplate。它在創建新會話時使用(Connection.createSession),但在JTA環境中運行時,將忽略傳遞給createSessiontransacted值。

+0

一位同事指出你說'sessionTransacted',所以我想這是一個紅鯡魚。當事務回滾時,JMS消息正在發送。 – pgreen2

1

你可以看到它的類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 { 

} 

基本上你必須有類路徑的JTA API,以及至少一個JTA提供商(Bitronix或Atomikos公司,如果你不使用應用服務器)。