У меня есть задача, которая состоит из 3 шагов prepare
, execute
, update
. prepare
и update
необходимо работать в рамках транзакции, тогда как execute
занимает очень много времени (то есть несколько минут до часа). Задача является частью EJB, т.е .:Как закончить транзакцию, управляемую контейнером, прежде чем запускать длинную задачу?
@Stateless
public class Task {
public void doTask() {
prepare();
execute();
update();
}
}
Мой вопрос, есть ли (элегантный) способ фиксации и завершить сделку после того, как prepare
и начать новую перед update
? Я бы предпочел использовать транзакции, управляемые контейнерами, и, возможно, не переключиться на использование UserTransaction
.
можно разделить задачи на отдельные EJBs, если он получает какое-либо преимущество, но учтите, что приостановка сделки по execute
(т.е. с использованием @Transactional(TxType.NOT_SUPPORTED)
не достаточно, так как это все еще вызывает тайм-аут.
Я попытался разделить это в TaskExecute
класс, который имеет @Asynchronous @Transactional(NOT_SUPPORTED) public void execute()
и отправка событие, когда сделано. Но это, кажется, не работает.
есть ли способ сделать это?
После некоторых дальнейших испытаний позвольте мне сделать вывод: ответ Александры был абсолютно правильным. Мое понимание должно было быть изменено. Прежде всего, я не знал, что @Transactional
не работает на EJB, но только на CDI-компонентах. Для EJB аннотация называется @TransactionAttribute
и может быть установлена в основном на те же значения. Комбинация @Asynchronous
и @TransactionAttribute(NOT_SUPPORTED)
действительно работает (если не дождаться результата).
Спасибо! Не знал о API обработки пакетной обработки. – Stephan