Сначала вы должны решить, хотите ли вы, чтобы асинхронный объект был обработан или нет. То есть, если обычная транзакция EJB-метода терпит неудачу, асинхронная вещь все еще запускается или нет.
JMS и TimerService
являются транзакционными. Spring TaskExecutor
, вероятно, нет (я должен проверить это дважды).
С помощью Timer
вы можете отложить выполнение (даже с 0) вещи, чтобы после возвращения метода EJB асинхронная вещь выполнялась сразу же в фоновом режиме. Если асинхронный сбой не выполняется, служба таймера пытается выполнить его несколько раз.
С JMS у вас нет строгого контроля над тем, когда вещь будет обработана. Как только сообщение отправлено, вы знаете, что оно будет в конечном итоге обработано, но брокер теоретически свободен отложить обработку для управления загрузкой.
Я не знаю вашего конкретного случая использования, но использование TimerService
кажется подходящим, если нагрузка не является проблемой, плюс она проста в использовании.