所以我运行一个Glassfish的3.1的Java EAR应用程序。 我创建了一个无状态会话Bean在我的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的构造方法,并得到一经推出调用。 但计时器方法本身似乎从来就没在任何时候触发。
其他人遇到过这个问题吗? 有一些其他的配置我失踪?
提前致谢。
下面定时器代码在3.1.2的GlassFish
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。 我不是专家,什么也不会,但它改变为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>
根据规范,计时器是持久性的约定:
计时器服务是用于长寿命的业务流程的建模。 计时器生存容器崩溃,服务器关闭,并与它们注册的企业bean的活化/钝化和加载/存储周期。 这些持续性的保证可以任选地在每计时器基础禁用。
斯文展示了如何保证持续性可以被禁用。 GlassFish服务器使用其默认数据库坚持其定时器(看看这里 )。 我能想象,这是跑不起来正因为如此计时器没有工作。 使用下面的命令来启动它:
asadmin start-database
我遇到同样的问题,当我在下面的教程。 我用Glassfish的4.1(JavaEE的7实现)。 我得到了同样的错误
相关信息:有此服务器所拥有的无EJB定时器
我刚刚创建动态Web模块。 不是一个EAR项目,EJB模块。 按照上面的答案我第一次通过插入改变了我的@Schedule()注释persistent=false
attribut像这样
@Schedule(第二= “/ 10" ,分=” “小时= ”8-23“,星期= ”周一至周五“,请将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>