我有一個需求,需要3-6個計劃任務才能在一天的給定時間運行。我對EJB定時器完全不熟悉,但已經讀過EJB定時器是處理Java EE容器中計劃任務的最佳方式。使用EJB定時器的Java EE調度程序任務
設計問題:
假設我需要10個計劃任務。如果可能的話,我不希望創建10個EJB定時器。 相反,我想創建一個EJB定時器,然後重新使用它來創建所需的計劃作業,併爲每個實例傳遞計劃的時間以運行(作爲參考),這可能嗎?有人可以請幫助這個骨架代碼嗎?
NB我想使用非持久性EJB計時器的...
我有一個需求,需要3-6個計劃任務才能在一天的給定時間運行。我對EJB定時器完全不熟悉,但已經讀過EJB定時器是處理Java EE容器中計劃任務的最佳方式。使用EJB定時器的Java EE調度程序任務
設計問題:
假設我需要10個計劃任務。如果可能的話,我不希望創建10個EJB定時器。 相反,我想創建一個EJB定時器,然後重新使用它來創建所需的計劃作業,併爲每個實例傳遞計劃的時間以運行(作爲參考),這可能嗎?有人可以請幫助這個骨架代碼嗎?
NB我想使用非持久性EJB計時器的...
AFAIK是不可能在一個EJB創建一個「可重複使用的」計時器怎麼一回事,因爲你必須知道哪些方法被調用每個定時器。
看一看這樣的:
的第三方庫Quartz Scheduler應該能夠以編程方式創建計時器對象。也許值得看看這個!
希望這個幫助,玩得開心!
您可以在無狀態/消息驅動的bean業務方法之一中定義一個定時器(但您仍然必須調用它,但無法創建可自行啓動的定時器)。然後,在@Timeout
方法,你可以重新創建基於找到合適的任何邏輯定時器,即
@Stateless
public SomeEJB ... {
@Resource
private TimerService timerService;
public void businessMethod() {
timerService.createTimer(...);
}
@Timeout
public void timeout(Timer timer) {
// do some timer-related logic, recreate the timer,
// perhaps with new duration
timerService.createTimer(...);
}
}
這個例子是EJB 3.0兼容。
另一種選擇(除了alreay說的)是使用單與@Schedule
註釋爲您的每個計時方法:
@Singleton
@Startup
public class TimedTaskManager {
@Schedule(second = "0", minute = "*/5", hour = "*")
public void runTask1() {
//
}
@Schedule(second = "15", minute = "*/5", hour = "6,7,8")
public void runTask2() {
//
}
//
//
@Schedule(second = "0", minute = "*", hour = "1,2,6")
public void runTaskN() {
//
}
}
感謝您的答覆傢伙,SimonSez看了一眼Quatz,這看起來很有希望,然而,使用Quartz會導致j2EE容器中的非託管線程?我想在Websphere中使用它,是否有在WAS中使用Quartz並且不存在ummanaged線程問題的方法? – stack 2012-03-20 14:02:38
我在開始時監視了我的環境(Glassfish 3.1.1)中的Quartz線程,並且找不到任何unnessacery/unmanaged線程,但是我偶然發現了一個導致此問題的舊bug報告(特別是與spring結合使用時)。從2.0.2開始可以修復。乾杯! – SimonSez 2012-03-20 14:36:00