2013-02-19 57 views
0

幾周前,我們開發了一個EJB 3.0 TimerService來按需調度一些任務(當用戶單擊按鈕時,我們將創建計時器以執行一些任務)。到目前爲止,它一直運行良好。EJB 3.0 TimerService redeploy

昨天我們重新部署了包含deTimerService的EJB來更新一些屬性,而今天沒有定時器被解僱,即使有一些定時器被創建。

¿這是正常的嗎?我的意思是,如果你不改變ejbTimeOut的簽名,它不應該在重新部署之後像往常一樣啓動嗎?

回答

1

定時器默認是持久的。當你重新啓動服務器,重新部署應用程序等可能如果他們錯過了,將超時。

我在過去遇到類似的問題。因此建議取消先前所有的定時器&然後再創建一個新的定時器。

+0

是的,我讀過類似的東西:在

asadmin redeploy --keepstate=true --name=taskee-1.0-SNAPSHOT target/taskee-1.0-SNAPSHOT.war 

更多信息。看起來如果服務器崩潰或重新啓動,它們會持續存在,但如果您重新部署應用程序,定時器將丟失,因此您有責任恢復或創建它們。感謝你的回答。 – carcaret 2013-02-19 13:58:06

+0

@carcaret不客氣。 – 2013-02-25 05:50:13

0

這就是EJB 3.0中的行爲。在EJB 3.1中,定時器服務變得更好。它支持在成功部署時創建的自動計時器。您可能想要查看升級到EJB 3.1是否適合您。

EE6教程:Using Timer Service

enterprise bean的定時器或者是編程定時器或自動 定時器。編程定時器通過明確調用TimerService接口的定時器創建方法之一來設置。自動計時器 是在成功部署企業Bean後創建的,其中 包含使用java.ejb.Schedule或 java.ejb.Schedules註釋註釋的方法。

2

爲了使計時器持續使用TimerHandle如下解釋:

要保存以供將來參考Timer對象,調用其getHandle方法和TimerHandle對象存儲在數據庫中。 (TimerHandle對象是可序列化的。)要重新實例化Timer對象,請從數據庫檢索句柄並在句柄上調用getTimer。 TimerHandle對象不能作爲在遠程或Web服務接口中定義的方法的參數傳遞。換句話說,遠程客戶端和Web服務客戶端無法訪問Bean的TimerHandle對象。然而,本地客戶並沒有這個限制。

http://docs.oracle.com/javaee/5/tutorial/doc/bnboy.html