2012-07-18 28 views
1

我有一個無狀態的EJB,並且有一個方法應該延遲調用不同的方法。 例如:延遲之後的Java EJB調用方法

EJB 1

public void start() 
{ 
    waitFor3Seconds(); 
    doSomething1(); 
    waitFor3Seconds(); 
    doSomething2(); 
    waitFor3Seconds(); 
    doSomething3(); 
} 

如何實現waitFor3Seconds()? 我不想使用Thread.sleep(),因爲它阻塞。

+0

_Any_方法,你用於造成延遲將必然阻止執行,無狀態會話EJB是嚴格同步 – 2012-07-18 22:46:06

回答

3

一個EJB不應該在加工過程中等待,它聞起來像糟糕的設計給我。也許你應該考慮異步處理? (也許使用MDB)。並請,拒用Thread.sleep()的誘惑,這就是EJB開發(重點煤礦)的restrictions之一:

具體來說,企業Bean不應該(...)創建或管理線程

另一種可能是爲計劃的許多任務需要的作業調度框架(比如,Quartz),設置崗位,開始一個接一個,在你的程序所需的時間。在您的示例中,需要三個作業:doSomething1(),doSomething2()doSomething3(),配置爲以所需的延遲開始。

2

使用計時器服務在Java EE提供:

http://docs.oracle.com/javaee/6/tutorial/doc/bnboy.html#bnbpa

你需要看到標題爲「創建程序定時器」

+0

我已經嘗試創建一個計時器,但這是不可重用的,因爲計時器將始終具有相同的onTimeout調用,而不是一個waitFor3Seconds()方法。 – sworded 2012-07-18 21:27:03

+0

創建3個不同的定時器,每個定時器都調用doSomething1(),doSomething2(),doSomething3()。如果事件依賴,則創建前一個定時器內的下一個定時器。 – 2012-07-18 21:28:04

+0

這工作,但不規模。超過10個定時器後它變得難以管理。 – sworded 2012-07-18 21:31:12

0

如何實現waitFor3Seconds()?我不想使用Thread.sleep(),因爲它阻塞。

無論您要實現什麼等待方法,您的EJB將被阻止—設計它將在方法返回後返回到免費EJB池。這就是爲什麼其他人建議使用異步處理。