如何解决在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 的 @Transactional
:refer。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。