几周前,我们开发了一个EJB 3.0 TimerService来根据需要安排一些任务(当用户点击按钮时,我们会创建计时器来执行某些任务)。到目前为止,它一直运作良好,直到今天。
昨天我们重新部署了包含de TimerService的EJB来更新一些属性,今天没有触发计时器,即使有一些已经创建。
¿这是正常的吗?我的意思是,如果你不改变ejbTimeOut的签名,重新部署后不应该像往常一样启动吗?
答案 0 :(得分:2)
要使计时器持久化,请使用TimerHandle,如下所述:
要保存Timer对象以供将来参考,请调用其getHandle方法并将TimerHandle对象存储在数据库中。 (TimerHandle对象是可序列化的。)要重新实例化Timer对象,请从数据库中检索句柄并在句柄上调用getTimer。 TimerHandle对象不能作为远程或Web服务接口中定义的方法的参数传递。换句话说,远程客户端和Web服务客户端无法访问bean的TimerHandle对象。但是,本地客户没有此限制。
答案 1 :(得分:1)
默认情况下,计时器是持久的。当您重新启动服务器时,可能会重新部署应用程序等,如果它们被错过,将会超时。
我过去遇到过类似的问题。因此,建议取消之前现有的所有计时器&然后再创建新的。
答案 2 :(得分:0)
这就是EJB 3.0中的行为。在EJB 3.1中,计时器服务变得更好。它支持自动计时器,该计时器是在成功部署后创建的。您可能希望了解升级到EJB 3.1是否适合您。
EE6教程:Using Timer Service
企业bean计时器可以是程序化计时器,也可以是自动计时器 计时器。程序化计时器通过显式调用其中一个来设置 TimerService接口的定时器创建方法。自动计时器 是在成功部署企业bean时创建的 包含用java.ejb.Schedule或注释的方法 java.ejb.Schedules annotations。
答案 3 :(得分:0)
使用asadmin redeploy命令,其中--keepstate标志等于true。
完整示例:
if($("#keywords").val().length < 3){
$("#keywords").autocomplete("off"):
}
更多信息:
http://www.oracle.com/technetwork/articles/java/pongegf-1517943.html