【问题标题】:change jta transaction timeout from default to custom将 jta 事务超时从默认更改为自定义
【发布时间】:2017-12-30 03:07:00
【问题描述】:

我正在使用 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 事务。

【问题讨论】:

    标签: jta atomikos


    【解决方案1】:

    来自Atomikos documentation

    com.atomikos.icatch.max_timeout

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

    确实,如果您查看 Atomikos 库源代码(适用于版本 4.0.0M4 和 3.7.0),在类 com.atomikos.icatch.imp.TransactionServiceImpcreateCC 方法中,您会看到:

    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 文档的 Spring 配置部分中指定的 The Advanced Case 配方。

    【讨论】:

    • 帮助解决了超时问题 -Dcom.atomikos.icatch.default_jta_timeout=300000
    【解决方案2】:

    我已经解决了类似的问题,即 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 文件中设置。

    【讨论】:

      猜你喜欢
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2014-09-14
      相关资源
      最近更新 更多