2012-08-01 27 views
2

我想記錄參與事務的EJB方法的錯誤或成功。我應該在哪裏放置伐木工具?據我所知,在我的doSomething完成後,交易將會發生。所以在這種方法中我不能確定提交是否成功。這引發了這個問題。從EJB記錄事務成功

public class MyEjb { 

    @Inject 
    AnotherEjb anotherEjb; 

    @Inject 
    LoggerEjb logger; 

    public void doSomeThing() { 
    MyBean b = getSomething(); 
    anotherEjb.persistSg(b); 

    /* logger.log is transaction if of attrubute NOT_SUPPORTED to 
     ensure separation from caller transaction */ 
    logger.log("Did something successfully."); 
    } 

} 

public class AnotherEjb { 

    @Inject 
    EntitiyManager em; 

    public void persistSg(MyBean entity) { 
    em.persist(entity); 
    } 
} 
+0

是您bean是否在執行任何數據庫插入/刪除/更新,還是隻調用另一個bean /類來執行此操作? – ChadNC 2012-08-01 11:50:43

回答

1

您是否嘗試過CDI的事務性觀察者?

http://docs.jboss.org/weld/reference/latest/en-US/html/events.html#d0e4075

此代碼觸發一個事件:

@Inject Event<CategoryUpdate> categoryUpdateEvent; 

public void someTransactionalMethod() { 
    CategoryUpdate categoryUpdate = new CategoryUpdate(); 
    categoryUpdateEvent.fire(categoryUpdate); 
} 

而這一塊的代碼遵守相同的事件,但如果交易成功,將只叫:

public void refreshCategoryTree(@Observes(during = AFTER_SUCCESS) CategoryUpdate event) { 
    ...... 
} 
-1

不幸的是,我認爲答案是「這取決於」 - 我不相信有一個適用於每一種情況通用的答案。例如,你不會說什麼調用這些EJB。如果你的架構有一個常見的「業務服務層」,那麼把日誌記錄放在那裏可能既實用又明智。

關於日誌本身,我建議你不要做上面你在做什麼。首先,不要調用.log本身。而是調用特定的日誌級別(DEBUG,INFO等)。接下來,在調用日誌語句之前檢查是否啓用此日誌級別。是的,這是一個PITA,但在性能方面有可衡量的結果。最後,儘量不要像上面所做的那樣記錄一小段文字。記錄是一個機會提供一些有用的信息,你在你手中的日誌文件。你錯過了這個機會!如果你登錄了,至少記錄一下你剛發現,創建的bean或者沒有的東西。

祝你好運!

+0

我希望每個人都會看到,這不是一個真正的代碼,只是這個概念的示範。 EJB是從JAX-RS註釋類調用的,實際上它是一個servlet,但這不在日誌方面的範圍內。 – jabal 2012-08-01 12:55:01

1

使用bean管理的事務,它允許您控制UserTransaction的begin/commit/rollback。我建議將開始/提交/回滾邏輯添加到EJB攔截器,因爲這可以讓您在多個EJB中重用邏輯。

+0

謝謝。所以你看不到用容器管理的事務做這件事的方法嗎? – jabal 2012-08-01 12:57:00

+1

@jabal您可以使用CDI攔截器並捕獲「EJBTransactionRolledbackException」。您需要始終使用'@Inject' /'BeanManager'(JNDI查找不起作用)。 – 2012-08-01 13:19:32