2014-02-13 3 views
0

мне нужно выполнить две вещи на обновление():Выполнение кода вне транзакции обновления

  • совершающие объект в базу данных
  • отправить объект через JMS

Поскольку объект является довольно большая передача через JMS должна быть вне транзакции базы данных. Проблема в том, что Seam добавляет транзакцию на основе фаз JSF, и поэтому транзакция базы данных уже активна, как только вызывается мое собственное переопределенное обновление().

Добавление обратного вызова к обновлению, например afterUpdate(), было бы неплохо, но это не представляется возможным.

Вопрос: Как я могу передать объект и после этого выполнить код вне транзакции?

Спасибо за помощь!

+0

вы можете использовать @PostPersist для запуска JMS-действия? – DaveB

+0

Я думаю, что это все равно будет в рамках транзакции. –

ответ

0

Я обнаружил, что транзакцией является операция Spring. Это позволяет что-то вроде:

 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { 
     @Override 
     public void afterCompletion(int status) { 
      switch (status) { 
       case STATUS_COMMITTED: 
        LOGGER.debug("update::afterCompletion"); 
        afterCompletionCallback(); 
        break; 
       case STATUS_ROLLED_BACK: 
        break; 
       case STATUS_UNKNOWN: 
       default: 
        break; 
      } 
     } 
    }); 

Сделка затем еще доступна, но база данных не запертая больше и любые интервалы времени не влияет на сделку Seam.

Смежные вопросы