2017-07-24 1621 views
3

我正在使用Atomikos進行JTA事務。 我爲JTA以下設置:將jta事務超時從默認更改爲自定義

UserTransactionImp userTransactionImp = new UserTransactionImp(); 
userTransactionImp.setTransactionTimeout(900); 

但是當我的代碼執行JTA事務,那麼如果它需要超過5分鐘(這是默認值),那麼它會拋出異常:

Caused by: com.atomikos.icatch.RollbackException: Prepare: NO vote 
    at com.atomikos.icatch.imp.ActiveStateHandler.prepare(ActiveStateHandler.java:231) 
    at com.atomikos.icatch.imp.CoordinatorImp.prepare(CoordinatorImp.java:681) 
    at com.atomikos.icatch.imp.CoordinatorImp.terminate(CoordinatorImp.java:970) 
    at com.atomikos.icatch.imp.CompositeTerminatorImp.commit(CompositeTerminatorImp.java:82) 
    at com.atomikos.icatch.imp.CompositeTransactionImp.commit(CompositeTransactionImp.java:336) 
    at com.atomikos.icatch.jta.TransactionImp.commit(TransactionImp.java:190) 
    ... 25 common frames omitted 

它看起來像它採取默認的jta事務超時(即使我設置超時明確(至15分鐘/ 900秒)

我嘗試使用application.properties文件中的以下屬性,但它仍然採用默認超時值(300秒)。

spring.jta.atomikos.properties.max-timeout=600000 
spring.jta.atomikos.properties.default-jta-timeout=10000 

我也試圖與下面財產,但沒有運氣:

spring.transaction.default-timeout=900 

任何人都可以提出,如果我需要任何其他設置?我正在使用wildfly插件,spring引導和atomikos api進行JTA事務。

回答

1

Atomikos documentation

com.atomikos.icatch.max_timeout

指定可以允許交易的最大超時(毫秒)。默認爲300000.這意味着調用UserTransaction.setTransactionTimeout()的值高於此處配置的值將被最大化爲該值。對於4.x或更高,值爲0意味着沒有最大值(即允許無限制超時)。

事實上,如果你看看在Atomikos公司庫的源代碼(兩個版本4.0.0M4和3.7.0),從類中的方法createCCcom.atomikos.icatch.imp.TransactionServiceImp您將看到:

387: if (timeout > maxTimeout_) { 
388:  timeout = maxTimeout_; 
389:  //FIXED 20188 
390:  LOGGER.logWarning ("Attempt to create a transaction with a timeout that exceeds maximum - truncating to: " + maxTimeout_); 
391: } 

因此,任何試圖指定一個較長的事務超時被限制爲maxTimeout_,如果沒有指定,則初始化期間將設置默認值300000。

您可以設置com.atomikos.icatch.max_timeout作爲JVM參數有:

-Dcom.atomikos.icatch.max_timeout=900000

,或者您可以使用在配置從Atomikos公司文檔春節規定The Advanced Case配方。

0

我已經解決了Spring Boot的application.yml(或application.properties)中的配置沒有被拾取的類似問題。

甚至有一個日誌,我後來發現在官方docs提到。

但是,我添加了transactions.properties文件(在application.yml旁邊),我在其中設置了我想要的屬性。

# Atomikos properties 

# Service must be defined! 
com.atomikos.icatch.service = com.atomikos.icatch.standalone.UserTransactionServiceFactory 

# Override default properties. 
com.atomikos.icatch.log_base_dir = ./atomikos 

某些屬性可以在transactions.properties設置和jta.properties文件中的其他。

相關問題