2016-09-21 65 views
0

對於我的Java EE(7)項目,我想使用Axon框架。 Axon ReplayingCluster的其中一個參數是TransactionManager,但Axon僅支持NoTransactionManagerSpringTransactionManagerAxon ReplayingCluster with JTA transaction

但是,如果我沒有誤認爲JTA,交易已由應用程序服務器在EntityManager(我已存儲在JpaEventStore中)管理。

我的問題:當我使用ReplayingClusterNoTransactionManager,這是否意味着JTA仍然會提供交易功能?

回答

2

事件重播可能涉及數千甚至數百萬事件。因此,在單個事務中管理單個重播通常是不可行的(假設您的事件偵聽器進行需要事務處理的更改)。

Axon在重播過程中使用TransactionManager以在每次重播一批事件時提交更改。該批次的大小可使用參數commitThreshold進行配置。

現在,我沒有使用JTA的經驗,但我的理解是,當方法返回時調用並提交bean方法時會自動創建一個事務。這意味着當你觸發重播時,它會在單次交易中完成。

因此,我的建議是將您自己的實施提供給ReplayingCluster。在一個EJB服務器這個實現可能是這個樣子:

class JtaTransactionManager implements TransactionManager<UserTransaction> { 

    @Resource 
    private SessionContext ctx; 

    @Override 
    public UserTransaction startTransaction() { 
     UserTransaction utx = ctx.getUserTransaction(); 
     utx.begin(); 
     return utx; 
    } 

    @Override 
    public void commitTransaction(UserTransaction utx) { 
     utx.commit(); 
    } 

    @Override 
    public void rollbackTransaction(UserTransaction utx) { 
     utx.rollback(); 
    } 

} 

然後,您可以註釋與@TransactionManagement(BEAN)啓動重播豆通知,你將親自管理這些交易的應用程序(這不會影響交易管理別處)。