2013-02-19 66 views
0

几周前,我们开发了一个EJB 3.0 TimerService来按需调度一些任务(当用户单击按钮时,我们将创建计时器以执行一些任务)。到目前为止,它一直运行良好。EJB 3.0 TimerService redeploy

昨天我们重新部署了包含deTimerService的EJB来更新一些属性,而今天没有定时器被解雇,即使有一些定时器被创建。

¿这是正常的吗?我的意思是,如果你不改变ejbTimeOut的签名,它不应该在重新部署之后像往常一样启动吗?

回答

1

定时器默认是持久的。当你重新启动服务器,重新部署应用程序等可能如果他们错过了,将超时。

我在过去遇到类似的问题。因此建议取消先前所有的定时器&然后再创建一个新的定时器。

+0

是的,我读过类似的东西:在

asadmin redeploy --keepstate=true --name=taskee-1.0-SNAPSHOT target/taskee-1.0-SNAPSHOT.war 

更多信息。看起来如果服务器崩溃或重新启动,它们会持续存在,但如果您重新部署应用程序,定时器将丢失,因此您有责任恢复或创建它们。感谢你的回答。 – carcaret 2013-02-19 13:58:06

+0

@carcaret不客气。 – 2013-02-25 05:50:13

0

这就是EJB 3.0中的行为。在EJB 3.1中,定时器服务变得更好。它支持在成功部署时创建的自动计时器。您可能想要查看升级到EJB 3.1是否适合您。

EE6教程:Using Timer Service

enterprise bean的定时器或者是编程定时器或自动 定时器。编程定时器通过明确调用TimerService接口的定时器创建方法之一来设置。自动计时器 是在成功部署企业Bean后创建的,其中 包含使用java.ejb.Schedule或 java.ejb.Schedules注释注释的方法。

2

为了使计时器持续使用TimerHandle如下解释:

要保存以供将来参考Timer对象,调用其getHandle方法和TimerHandle对象存储在数据库中。 (TimerHandle对象是可序列化的。)要重新实例化Timer对象,请从数据库检索句柄并在句柄上调用getTimer。 TimerHandle对象不能作为在远程或Web服务接口中定义的方法的参数传递。换句话说,远程客户端和Web服务客户端无法访问Bean的TimerHandle对象。然而,本地客户并没有这个限制。

http://docs.oracle.com/javaee/5/tutorial/doc/bnboy.html