0

我有一个在两个不同实例上运行的 Spring Web 应用程序。这两个实例彼此不知道,它们在不同的服务器上运行。

该应用程序有一个预定的 Quartz 作业,但我的问题是该作业不应该在实例上同时执行,因为它是一个邮件发送作业,它可能会导致发送重复的电子邮件。

我正在使用 RAMJobStore,而 JDBCJobStore 对我来说不是一个选项,因为它需要大量表。(由于内部限制,我无法创建许多表)

我想到的解决方案: -创建一个控制表,每次作业开始时都必须检查(具有可重复的读取隔离级别以避免并发问题)问题是如果服务器被杀死,表可能会留在无效状态。

- 使用属性将单个服务器定义为作业运行服务器。问题是如果该服务器出现故障,作业将停止运行

有没有人遇到过这个问题,你有什么想法可以分享吗?

4

1 回答 1

1

从第二种解决方案开始(在除一个以外的所有节点上停用 qartz)。这很简单,而且很安全。计算您的服务器出现故障的频率。如果不可接受,请尝试第一个解决方案。第一个解决方案的问题在于,您需要具备良好的多线程编程技能才能在没有错误的情况下实现它。如果多线程不是您的日常任务,事情就不那么简单了。并且您的实施中的一些错误的成本可能大于实际利润。

于 2013-07-10T14:29:18.680 回答