我的 Java Spring 应用程序可通过两个 Tomcat 实例的负载平衡来使用。
用户可以将复杂的任务发送到无法并行运行的应用程序,如果类似任务在几个小时前已经执行,则必须跳过其中一些任务。
我有 Oracle DB 和 RabbitMQ 作为存储,但不知道如何使用它们在运行的应用程序之间以及所选应用程序的线程内执行原子操作和同步。
复杂性之一 - 故障安全,因此如果一个应用程序获取锁以执行某些操作然后停止(或服务器关闭、硬件故障等),则必须在超时后释放锁,以便另一个应用程序或恢复的第一个应用程序可以执行清理操作并重新运行任务。
因此,我寻找以安全方式同步 Java 应用程序的任何可能性,以便一次仅由一个应用程序执行任务。
PS正式我想要持久存储:
ID
DATE
STATE
其中ID
是任务类型,是原子操作DATE
更改的最新时间:STATE
- 原子地
STATE
从完成或失败更改为锁定执行ID
。如果ID
在执行或恢复STATE
中选择- 返回false。否则设置STATE
为执行并更新DATE
到当前时间。 - 如果距离当前太远(标记任务执行或恢复失败),则
STATE
自动从执行或恢复 状态更改STATE
为当前状态并更新为当前状态。如果无法获取锁或任务不在执行或恢复中,则返回false。DATE
DATE
ID
STATE
- 通过更新到当前,原子地
STATE
从恢复变为失败。如果无法获取锁定或任务不在恢复DATE
中,则返回false。ID
STATE
似乎这些操作足以使故障安全任务同步......