具有Spring Boot和MongoDB的集群式Quartz Scheduler


如果您并行启动两个服务实例,那么Quartz的Spring Boot库将无法正常工作。每个服务都开始执行相同的作业,而预期的行为是选择一个实例来执行该作业,另一个实例在后台等待,并且在第一个服务失败的情况下,另一个将被执行。当选。

出于多种原因,Springs的@Scheduled注释是一种非常便捷的计划任务的方式。但是,如果您具有群集环境,并且必须仅从一个节点运行任何作业,那将不成立。您意识到所有计划的作业将几乎同时开始执行。这可能导致问题,从不必要的调用到数据不一致。

在寻找一种解决方案来实现这种行为时,我发现ShedLock和Quartz曾经是突出的,而后者则更加健壮,可以在任何Java应用程序中使用,因此使用最广泛,而前者则更易于配置。

在本文中,我将讨论如何使用Quartz在集群环境中实现单执行。但是不要害怕Quartz。

因此,让我们从向应用程序添加依赖关系开始。默认情况下,Quartz仅提供对传统关系数据库的支持。但是,由于迈克尔Klishin和MuleSoft,谁创造了一个实现的MongoDB集群环境中的Quartz库的(可以发现这里在GitHub上)。

6.png

我在application.yml中设置了如下配置。您可以选择其他结构,也可以使用默认的spring.quartz.YYYY。缩进所有这些属性有点冗长(尽管懒惰是邪恶的),所以我选择了这个属性。您可以在此处检查所有调度程序属性。

5.png

如您所见,我做到了org.quartz.jobStore.isClustered。根据文档,群集当前仅适用于JDBC-Jobstore (JobStoreTX or JobStoreCMT),并且实质上是通过使群集的每个节点共享同一数据库来工作的。

负载平衡是自动发生的,群集中的每个节点都会尽快启动作业。当触发器的触发时间发生时,第一个获得锁的节点将触发它。

接下来,我们需要让Spring使用SchedulerFactoryBean管理Quartz调度程序的创建。此外,从application.yml加载所有属性

4.png

接下来是要执行的作业。请注意,除非必要且与作业本身相关,否则建议不要添加任何业务逻辑。

3.png

最后,让我们定义乔布斯及其触发器。

2.png

最后,在作业执行时要调用的服务:

1.png

现在运行Spring Boot应用程序时,您应该看到创建了以下集合:

  • quartz_calendars
  • quartz_jobs
  • quartz_locks
  • quartz_schedulers
  • quartz_triggers

注意:如果您想拥有自定义的工作存储,则可以阅读本文。

如果您读了那么多文章,则意味着您喜欢这篇文章。谢谢你。


原文链接:http://codingdict.com