Glassfish服务器上的自动EJB计时器不会触发

时间:2012-10-26 18:41:11

标签: java-ee ejb glassfish-3 ejb-3.1 ear

所以我在Glassfish 3.1上运行Java EAR应用程序。我在EJB Module中创建了一个带有单个带注释的计时器函数的无状态会话bean。我没有确切的代码,但它看起来像这样:

@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的构造函数方法。但是计时器方法本身似乎永远不会被触发。

还有其他人有这个问题吗?我还缺少其他一些配置吗?

提前致谢。

3 个答案:

答案 0 :(得分: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.

所以我把'保持状态'改为假。我不是它的专家,但是将它改为false使得计时器工作没有持久性=假

我在下面的文件中更改了

与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>

答案 1 :(得分:4)

根据规范,定时器按照惯例持久存在:

  

计时器服务旨在用于长期业务的建模   流程。计时器崩溃,服务器关闭,以及   企业bean的激活/钝化和加载/存储周期   在他们身上注册的。这些持久的保证可以   可选择基于每个计时器禁用。

Aksel演示了如何禁用持久性保证。 glassfish服务器使用其默认数据库来持久化其计时器(看看here)。我可以想象它没有启动和运行,因此定时器没有工作。使用以下命令启动它:

asadmin start-database

答案 2 :(得分:2)

当我关注教程时,我遇到了同样的问题。我使用的是Glassfish 4.1(JavaEE 7实现)。我得到了同样的错误

  

信息:此服务器不拥有EJB计时器

我刚刚创建了一个动态Web模块。不是具有EJB模块的EAR项目。 根据上述答案,我首先通过插入persistent=false attribut来改变我的@Schedule()注释

  

@Schedule(second =“ / 10”,minute =“”,hour =“8-23”,dayOfWeek =“Mon-Fri”,         dayOfMonth =“”,month =“”,year =“*”,info =“MyTimer”,persistent = 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>