在Spring重试期间如何基于线程增加Atomikos默认的JTA超时

问题描述

我正在将Spring boot应用程序与Atomikos事务一起使用。我已在交易属性中将认超时配置为10000毫秒,即10秒。

交易.properties

com.atomikos.icatch.default_jta_timeout=10000
com.atomikos.icatch.threaded_2pc=true
com.atomikos.icatch.max_timeout=300000
com.atomikos.icatch.max_actives=1000 

由于Jta超时,如果任何用户事务花费的时间超过10秒,则该特定线程事务将超时并回滚。

Atomikos花费超过指定阈值时间的用户事务日志。

[Atomikos:3] [] [] [] [] c.a.icatch.imp.ActiveStateHandler - Transaction InsightJTA160327483422900028 has timed out - rolling back...

在这里,我的问题是,我正在对特定功能使用Spring retry。例如,如果发生任何数据库异常或MQ异常,那么我将以30秒的间隔对相同的函数进行3次重试,如下所示,

            retryTemplate.execute(context -> {
                log.info("Processing request...");   // Time interval 30 sec,max attempts 3  
                saveUserOperation(user);             // if any exception,current thread time out,dropMessagetoMQ(message);            // should be increased to 120S(120000ms) 
            });  

在这里,如果saveUserOperation或dropMessagetoMQ抛出任何异常,那么Spring重试将在30秒后开始,但是这里我将认JTA时间配置为10秒,因此在重试开始之前,事务已超时。我只想知道,重试发生时是否有可能增加当前线程的超时时间。

我可以增加认超时,但是它将适用于所有线程,我不想这样做。

解决方法

在 JTA setTransactionTimeout 对象上尝试 UserTransaction

或者使用带有超时的 Spring 的 @Transactionalrefer

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...