如何在将处理程序移动到不同的 WAR 文件后移动 EJC 计时器

How to move EJC timers after moving the handler to a different WAR file

目前我有一个整体应用程序,我通过它以编程方式创建了许多 EJB 计时器,以便在将来的某个时间过期。 我使用 Java EE 7 和 WildFly 12 来完成。我已将 WildFLy 配置为将其持久保存到数据库中,然后将其序列化并保存以备在其 TimeOut 时进行处理,此处一切正常。 现在我正在将整体拆分为微服务并面临迁移这些计时器的问题。

有什么方法可以干净地做到这一点吗?欢迎提出任何建议。

首先,我尝试更新数据库上的计时器,但注意到这不起作用,因为对象是使用添加的元数据序列化的,其中包含它所属的部署 war 文件。

其次,我正在考虑创建一个一次性批处理以循环遍历每个计时器并在要删除计时器时发布一条消息,以便新的微服务将接收该消息并在其自己的模式上正确创建计时器部署信息。但是我不喜欢这个解决方案,因为它非常混乱并且涉及添加很多 if 语句来满足不同类型的计时器。

ejb_timer_id = warFileName.warFileName.MyTimerEventHandler
expire_date = 2019-01-04 08:55:00.0000000 serialized_object = Pk9jb20ubWlkbGFuZGhyLnRyZW50LnRhbGVudC5jaGVja2luLnRpbWVycy5OZXh0U2NoZWR1bGVkQ2hlY2tJbkV4cGlyZWRUaW1lckV2ZW50GHMausCwvz8+FGRlcGxveW1lbnQudHJlbnQud2FyPgRtYWluAAAAAj4YbmV4dFNjaA==

为了让它工作,我需要成功地将 ejb_timer_id 从 warFileName.warFileName.MyTimerEventHandler 更新到 newWarFileName.newWarFileName.MyTimerEventHandler 并且需要更新序列化对象以包含新的 deploymnet 详细信息,例如来自myWarFile 到 myNewWarFile

计时器并不意味着在不同的应用程序或 bean 之间进行迁移。 所以这是一个手动过程。 如果应用程序是 undeployed/redeployed 并且计时器 bean 已更改或删除,也可能会有副作用。有可能定时器数据还在持久化中