2015-07-14 3 views
1

У меня есть задача, которая состоит из 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) действительно работает (если не дождаться результата).

ответ

1

Это зависит от версии Java EE, которую вы хотите использовать. Вот три возможных решения.

  • использование JMS, отправить соответствующее сообщение и сделать execute в MDB (любой версии, но требуется полный профиль)
  • использование Java EE 6.0 в службы таймера и запланировать задачу выполнить execute асинхронно (@Timeout)
  • Использовать API обработки пакетной обработки Java EE 7.0, чтобы запланировать надлежащее длительное пакетное задание.

Последнее, вероятно, то, что вы ищете, но доступно только в Java EE 7.0 и выше. В противном случае решения JMS являются самыми чистыми, но если JMS не является вариантом, Timer Service должна работать.

+0

Спасибо! Не знал о API обработки пакетной обработки. – Stephan