2015-11-05 95 views
1

我有一個任務需要完成,這涉及到在我的EJB事務回滾的情況下回滾對非事務數據庫的更改。攔截EJB事務回滾

該項目採用容器管理的事務和業務邏輯涉及到自己調用其他EJB方法的EJB方法調用,因此交易跨越邊界的方法,並涉及多個EJB。

的EJB事務回滾工作正常,但我需要能夠檢測到它已經發生,然後將試圖回滾其他非交易數據庫的方法滅火。

我想知道如何使用攔截器,但似乎我只能截取特定的方法調用,或一個特定的EJB生命週期事件。這對我的目的來說還不夠。我需要攔截事務回滾事件。這可能嗎?我吠叫錯了樹嗎?也許還有另一種方法可以更好地適合我的目的。

我看到了相關的問題,但它並沒有真正幫助我,因爲我有許多切入點,許多嵌套的方法和我不能只截取一個方法。

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

回答

1

如果您正在使用容器管理事務,那麼當EJB方法調用成功,這是保證該交易已經COMMITED,如果你得到一個異常,則確保了交易的有已經回滾。

所以,我看到的是周圍使用實際的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