将jta事务超时从默认更改为自定义

时间:2017-07-24 13:36:28

标签: jta atomikos

我正在使用Atomikos进行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 boot和atomikos api进行JTA交易。

2 个答案:

答案 0 :(得分:1)

来自Atomikos documentation

  

com.atomikos.icatch.max_timeout

     

指定事务允许的最大超时(以毫秒为单位)。默认为300000.这意味着使用高于此处配置的值调用UserTransaction.setTransactionTimeout()将最大化为此值。对于4.x或更高,值0表示没有最大值(即,允许无限制超时)。

的确,如果您查看Atomikos库源代码(适用于版本4.0.0M4和3.7.0),请在类createCC的{​​{1}}方法中看到:

  
com.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: } ,如果没有指定,则会在初始化期间设置默认值300000。

您可以使用以下命令将maxTimeout_设置为JVM参数:

com.atomikos.icatch.max_timeout

或者您可以使用Atomikos文档中 Spring for Spring 部分中指定的The Advanced Case配方。

答案 1 :(得分:1)

我已经解决了类似的问题,其中Spring Boot的application.yml(或应用程序属性)中的配置没有被提取。

我甚至在官方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文件中设置其他属性。