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