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

Man*_*esh 6 jta atomikos

我正在使用 Atomikos 进行 JTA 事务。我对 JTA 有以下设置:

UserTransactionImp userTransactionImp = new UserTransactionImp();
userTransactionImp.setTransactionTimeout(900);
Run Code Online (Sandbox Code Playgroud)

但是当我的代码执行 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
Run Code Online (Sandbox Code Playgroud)

看起来它采用了默认的 jta 事务超时(即使我明确地设置了超时(到 15 分钟/900 秒)。

我尝试在 application.properties 文件中使用以下属性,但它仍然采用默认超时值(300 秒)。

spring.jta.atomikos.properties.max-timeout=600000
spring.jta.atomikos.properties.default-jta-timeout=10000
Run Code Online (Sandbox Code Playgroud)

我也尝试过以下属性,但没有运气:

spring.transaction.default-timeout=900
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议我是否需要任何其他设置?我正在使用 wildfly 插件、spring boot 和 atomikos api 进行 JTA 事务。

hig*_*aro 2

来自Atomikos 文档

com.atomikos.icatch.max_timeout

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

事实上,如果您查看 Atomikos 库源代码(对于版本 4.0.0M4 和3.7.0),在createCC类的方法中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:   }
Run Code Online (Sandbox Code Playgroud)

因此,任何指定较长事务超时的尝试都会受到限制,maxTimeout_如果未指定,则在初始化期间设置默认值 300000。

您可以将其设置com.atomikos.icatch.max_timeout为 JVM 参数:

-Dcom.atomikos.icatch.max_timeout=900000

或者您可以使用Atomikos 文档中Spring配置部分中指定的高级案例配方。