簡體   English   中英

如何在執行長任務之前完成容器管理的事務?

[英]How to finish a container-managed transaction before running a long task?

我的任務包括prepareexecuteupdate 3個步驟。 prepareupdate需要在事務中工作,而execute需要很長時間(即幾分鍾到幾小時)。 該任務是EJB的一部分,即:

@Stateless
public class Task {
    public void doTask() {
        prepare();
        execute();
        update();
    }
}

我的問題是,在prepare並在update之前啟動新事務之后,是否有(優雅)的方法來提交和完成事務? 我寧願使用容器管理的事務,也可能不切換為使用UserTransaction

如果有優勢,可以將任務拆分為單個EJB,但是請注意,暫停事務以execute (即,使用@Transactional(TxType.NOT_SUPPORTED)是不夠的,因為這仍會觸發超時。

我試圖將其拆分為具有@Asynchronous @Transactional(NOT_SUPPORTED) public void execute()TaskExecute類,並在完成后發送事件。 但這似乎也不起作用。

有沒有辦法做到這一點?


經過進一步的測試后,我得出結論:亞歷山大的回答是絕對正確的。 我的理解必須改變。 首先,我不知道@Transactional不適用於EJB,而僅適用於CDI bean。 對於EJB,注釋稱為@TransactionAttribute ,可以將其設置為基本上相同的值。 @Asynchronous@TransactionAttribute(NOT_SUPPORTED)確實有效(如果不等待結果)。

這取決於您要使用的Java EE版本。 這是三種可能的解決方案。

  • 使用JMS,發送適當的消息並在MDB中execute (任何版本,但需要完整的概要文件)
  • 使用Java EE 6.0的Timer Service並計划任務以異步執行execute@Timeout
  • 使用Java EE 7.0的批處理API安排適當的長期運行的批處理作業。

后者可能是您要尋找的,但是僅在Java EE 7.0及更高版本中可用。 否則,JMS解決方案是最干凈的,但是如果不能選擇JMS,則Timer Service應該可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM