Как увеличить время ожидания jta Atomikos по умолчанию на основе потока во время весеннего повтора

#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 с таймаутом: см. .