Timer 跨重新部署的JEE6计时器持久性

Timer 跨重新部署的JEE6计时器持久性,timer,java-ee-6,ejb-3.1,Timer,Java Ee 6,Ejb 3.1,我正在开发的应用程序的任务之一是备份系统上运行的其他应用程序的数据。我想安排此备份过程,以便它可以在无人值守的情况下运行。我正在使用JEE6/EJB3.1定时器实用程序 我有一个类BackupConfiguration,我使用JPA2将它持久化到一个数据库,JPA2有一个TimerHandle类型的字段。如果用户决定安排备份,我将创建一个新的持久计时器并填充TimerHandle字段 如果我重新启动服务器,一切正常,计时器重新启动(当所有计时器同时启动时会出现短暂的恐慌,叹气),一切都和我离开时

我正在开发的应用程序的任务之一是备份系统上运行的其他应用程序的数据。我想安排此备份过程,以便它可以在无人值守的情况下运行。我正在使用JEE6/EJB3.1定时器实用程序

我有一个类BackupConfiguration,我使用JPA2将它持久化到一个数据库,JPA2有一个TimerHandle类型的字段。如果用户决定安排备份,我将创建一个新的持久计时器并填充TimerHandle字段

如果我重新启动服务器,一切正常,计时器重新启动(当所有计时器同时启动时会出现短暂的恐慌,叹气),一切都和我离开时一样

如果我重新部署应用程序(在我开发应用程序时经常发生这种情况),那么所有的计时器都会丢失!我愚蠢地假设计时器将绑定到服务器,但事实证明它们绑定到应用程序

那么,我的问题是,让计时器在重新部署过程中保持持久性的最佳方法是什么

我能看到的唯一解决方案是在备份配置中存储ScheduleExpression和TimerHandle。然后,如果我有一个句柄但没有计时器,我会重新创建计时器。不过,这种方法的主要问题是,它意味着每次应用程序开始查找是否缺少计时器时,都要枚举每个计划的实体。目前这并不是很多工作,但在未来,这可能会成为一个巨大的成本。

似乎大多数(可能所有)应用程序服务器都将计时器持久化到应用程序而不是服务器。这是有意义的,因为当你删除一个应用程序时,你不想让计时器挂在周围。不过,在开发过程中这很尴尬,因为至少NetBeans会在重新部署之前删除应用程序,从而丢失所有计时器


我提出的解决方案是将TimerHandle和调度信息存储在数据库中。当应用程序启动时,它会创建一个TimerRepair单例bean,该bean在任何需要它的类上调用RepairTimer。repairTimers方法选择所有计划,如果计划有计时器Handle,则尝试恢复计时器。如果计时器恢复引发异常,它将根据调度信息重新创建计时器。总的来说,作为一个解决方案,它还不算太糟糕,我唯一真正关心的是,如果安排了很多项目,那么启动时间过长。

对于GlassFish,有
--keepstate=true
选项,可以使用
asadmin redeploy
命令。
它在重新部署之间保留EJB计时器。
有关详细信息,请参见:



您正在使用哪个应用程序服务器?您正在描述WebSphereApplicationServer的行为,但并不清楚。如果您使用的是应用程序服务器,那么我不认为在重新部署期间可以避免清除持久计时器,除非您的应用程序服务器在执行卸载时停止(例如,使用断开连接的wsadmin会话)。我使用的是GlassFish 3.0.1,这似乎是标准行为。