即使应用程序位于多个节点中,如何限制 Quartz 作业仅运行一次?

0 java oracle quartz-scheduler email-attachments spring-boot

Spring Boot 中有 QuartzJob 计划每天运行几次,以发送从数据库生成的报告。

我的应用程序位于 4 台服务器中。为每个计划生成 4 个报告。

我想限制这一点并发送一份报告。

我不能仅从特定节点发送。

小智 5

一种选择是对您的配置进行集群化。基本上,集群仅适用于 JDBC-Jobstore(JobStoreTX 或 JobStoreCMT),并且本质上是通过让集群的每个节点共享相同的数据库来工作的。

\n\n

负载平衡会自动发生,集群的每个节点都会尽快触发作业。当触发器\xe2\x80\x99s触发时间发生时,第一个获取它的节点(通过在其上放置锁)是将触发它的节点。

\n\n

每次触发时只有一个节点会触发该作业。我的意思是,如果作业有一个重复触发器,告诉它每 10 秒触发一次,那么在 12:00:00 恰好有一个节点将运行该作业,在 12:00:10 恰好有一个节点将运行它不一定每次都是同一个节点 - 哪个节点运行它或多或少是随机的。

\n\n

来源:http ://www.quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering.html

\n\n

以下是配置示例:\n1 - https://github.com/davidkiss/spring-boot-quartz-demo \n2 - http://www.opencodez.com/java/quartz-scheduler-with-spring-启动.htm

\n\n

此时,您将只有一个节点处理您的报告。如果您需要处理来自所有节点的信息,您可以从该节点向其他节点请求报告数据并混合它们。所有节点都将具有相同的逻辑,因此您每次将生成 1 个报告,并且您将从所有节点获取数据。

\n\n

其他选项是保持节点像现在一样工作,但在发送报告并将所有信息收集在一起之前将报告数据发送到公共位置。使用这种方法,您将需要多一个过程。

\n\n

如果对您有帮助,请告诉我!

\n