所以我在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的构造函数方法。但是计时器方法本身似乎永远不会被触发。
还有其他人有这个问题吗?我还缺少其他一些配置吗?
提前致谢。
答案 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>