[英]How to finish a container-managed transaction before running a long task?
我的任務包括prepare
, execute
, update
3個步驟。 prepare
和update
需要在事務中工作,而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版本。 這是三種可能的解決方案。
execute
(任何版本,但需要完整的概要文件) execute
( @Timeout
) 后者可能是您要尋找的,但是僅在Java EE 7.0及更高版本中可用。 否則,JMS解決方案是最干凈的,但是如果不能選擇JMS,則Timer Service應該可以工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.