2012-10-26 54 views
3

因此,我在Glassfish 3.1上運行Java EAR應用程序。我在EJB模塊中創建了一個帶有單註釋計時器功能的無狀態會話bean。我沒有確切的代碼,但它看起來是這樣的:Glassfish服務器上的自動EJB計時器未觸發

@Stateless 
public class SessionTimerBean { 

    public SessionTimerBean(){ 
     System.out.println("Constructor Called"); 
    } 

    @Schedule(second="*/10", minute="*", hour="*") 
    public void scheduleTimer(final Timer t) { 
     System.out.println("Timer Called"); 
    } 
} 

當我啓動Glassfish的調試信息似乎表明它承認EJB計時器註釋和Bean的構造方法,在不被調用發射。但是定時器方法本身從來沒有被觸發過。

有沒有其他人有這個問題?是否有一些其他配置我錯過了?

在此先感謝。

+0

它是否使差異從方法中刪除參數? –

+0

我也會檢查導入是否正確javax.ejb.Timer等.. –

+0

有沒有運氣呢?同樣的問題在這裏,沒有方法params – DTs

回答

4

下面定時器代碼在GlassFish中3.1.2

import javax.ejb.Schedule; 
import javax.ejb.Stateless; 
import javax.ejb.Timer; 

@Stateless 
public class LabbBean { 

    @Schedule(second="*/5", minute="*",hour="*", persistent=false) 
    public void method123(final Timer timer) { 
     System.out.println("Timer1234"); 
    } 
} 

但採空當我在服務器日誌中刪除的

persistent=false 

所以工作,我發現:

INFO: keepstate is true and will not create new auto timers during deployment. 

所以我改變了'保持狀態'爲假。我不是專家,什麼也不會,但它更改爲假髮定時器工作,而持久=假

我改變了它在下面的文件

與GlassFish ejb.xml:

<glassfish-ejb-jar> 
    <enterprise-beans> 
    ... 
    </enterprise-beans> 
    <keep-state>false</keep-state> 
</glassfish-ejb-jar> 

與GlassFish的application.xml

<glassfish-application> 
    <keep-state>false</keep-state> 
</glassfish-application> 
+0

工作,謝謝! – DTs

+0

值得注意的是,取決於應用程序,可能會更好地設置persistent = false以保持keep-state = true。在這種情況下,可以在重新部署之間保留Web會話,有狀態會話EJB實例和持久創建的EJB定時器。 http://docs.oracle.com/cd/E18930_01/html/821-2417/gkhtr.html – DTs

4

根據規範,計時器是持久性的約定:

計時器服務用於建模長期業務 進程。計時器在容器崩潰,服務器關閉以及向其註冊的企業bean 的激活/鈍化和加載/存儲週期內倖免於難。這些持久性保證可以選擇性地在每個定時器的基礎上禁用 。

阿克塞爾演示瞭如何持續保證可以被禁用。 glassfish服務器使用其默認數據庫來保存其定時器(看看here)。我可以想象它沒有正常運行,因此定時器不起作用。使用以下命令啓動它:

asadmin start-database 
2

我在跟蹤教程時遇到同樣的問題。我正在使用Glassfish 4.1(JavaEE 7實現)。我得到了同樣的錯誤

相關信息:有此服務器

我剛剛創建動態Web模塊擁有沒有EJB計時器。不是帶EJB模塊的EAR項目。 按照上述答案我首先通過將persistent=false attribut像這樣

@Schedule(第二= 「/10" ,分=」 「小時=」 8-23改變了我@Schedule()註釋「星期= 」週一至週五「, 請將dayOfMonth =」 「一個月=」」,一年= 「*」,信息= 「MyTimer」,執着= FALSE)

然後我去了我glasshish-web.xml部署描述符,我把下面的配置<keep-state>false</keep-state>放在這樣的部分:

<glassfish-web-app> 
    <context-root>/HelloWorld</context-root> 
    **<keep-state>false</keep-state>** 
</glassfish-web-app>