#transactions #jta #spring-retry #atomikos
#транзакции #jta #весна-повторная попытка #atomikos
Вопрос:
Я использую приложение Spring boot с транзакциями Atomikos. Я настроил время ожидания по умолчанию как 10000 мс, что составляет 10 секунд в свойствах транзакций.
транзакции .свойства
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...
Здесь мой вопрос в том, что я использую весеннюю повторную попытку для определенных функций. Например, если возникнет какое-либо исключение базы данных или исключение MQ, я повторю попытку для одной и той же функции 3 раза с интервалом в 30 секунд, как показано ниже,
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 секунд, поэтому перед началом повторной попытки транзакция получила тайм-аут. Я просто хочу знать, есть ли какая-либо возможность увеличить время ожидания для текущего потока при повторной попытке.
Я могу увеличить время ожидания по умолчанию, но оно будет применимо ко всем потокам, я не хочу этого делать.
Ответ №1:
Попробуйте setTransactionTimeout
объект JTA UserTransaction
.
Или используйте Spring @Transactional
с таймаутом: см. .