2015-11-05 3 views
1

У меня есть задача завершить, что включает в себя откатывание изменений в базу данных без транзакций в случае отката моей транзакции EJB.Перехват транзакции перехвата EJB

Проект использует транзакции, управляемые контейнером, а бизнес-логика включает вызовы методов EJB, которые сами называют другими методами EJB, поэтому транзакция пересекает границы методов и включает в себя несколько EJB.

Откат транзакции EJB работает нормально, но мне нужно уметь обнаружить, что оно произошло, а затем запустить метод, который попытается откат другой не транзакционной базы данных.

Я задавался вопросом об использовании перехватчика, но кажется, что я могу только перехватить конкретный вызов метода или конкретное событие жизненного цикла EJB. Этого недостаточно для моей цели. Мне нужно перехватить событие отката транзакции. Это возможно? Я лаяю неправильное дерево? Возможно, есть другой подход, который лучше подходит моей цели.

Я видел связанный с ним вопрос, но мне это действительно не помогает, поскольку у меня много точек входа, много вложенных методов, и я не могу просто перехватить один метод.

EJB Interceptors and transaction lifecycle OR how to intercept a commit/failure event?

ответ

1

При использовании управляемого контейнера транзакций, а затем, когда вызов методы EJB успешно, это гарантирует, что сделка была поручена, и если вы получите исключение, то это гарантирует, что сделка имеет откат.

Таким образом, один из возможных способов использования EJB-обертки вокруг фактического вызова EJB (REQUIRES_NEW важен здесь).

@Stateless 
public class EJBWrapper { 

    @EJB 
    private EJBService service; 

    public void wrapperMethod() { 
     try {  
      service.actualMethod(); // the real work is done here 
     } catch (RuntimeException) { 
      // transaction has been rolled back here 
     } 
    } 
} 

@Stateless 
public class EJBService { 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void actualMethod() { 
     // do your work here 
    } 
} 

Вам нужно будет поместить обертку вокруг каждой соответствующей услуги.

+0

Спасибо @jhyot, я думаю, что это, вероятно, путь, так как это единственный способ убедиться, что бизнес-метод завершен, и транзакция находится в состоянии, в котором оно прошло или прошло неудачно. Я вижу много рефакторинга в будущем :) – Matt

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