如果您并行启动两个服务实例,那么Quartz的Spring Boot库将无法正常工作。每个服务都开始执行相同的作业,而预期的行为是选择一个实例来执行该作业,另一个实例在后台等待,并且在第一个服务失败的情况下,另一个将被执行。当选。
出于多种原因,Springs的@Scheduled注释是一种非常便捷的计划任务的方式。但是,如果您具有群集环境,并且必须仅从一个节点运行任何作业,那将不成立。您意识到所有计划的作业将几乎同时开始执行。这可能导致问题,从不必要的调用到数据不一致。
在寻找一种解决方案来实现这种行为时,我发现ShedLock和Quartz曾经是突出的,而后者则更加健壮,可以在任何Java应用程序中使用,因此使用最广泛,而前者则更易于配置。
在本文中,我将讨论如何使用Quartz在集群环境中实现单执行。但是不要害怕Quartz。
因此,让我们从向应用程序添加依赖关系开始。默认情况下,Quartz仅提供对传统关系数据库的支持。但是,由于迈克尔Klishin和MuleSoft,谁创造了一个实现的MongoDB集群环境中的Quartz库的(可以发现这里在GitHub上)。
我在application.yml中设置了如下配置。您可以选择其他结构,也可以使用默认的spring.quartz.YYYY。缩进所有这些属性有点冗长(尽管懒惰是邪恶的),所以我选择了这个属性。您可以在此处检查所有调度程序属性。
如您所见,我做到了org.quartz.jobStore.isClustered。根据文档,群集当前仅适用于JDBC-Jobstore (JobStoreTX or JobStoreCMT),并且实质上是通过使群集的每个节点共享同一数据库来工作的。
org.quartz.jobStore.isClustered
JDBC-Jobstore (JobStoreTX or JobStoreCMT)
负载平衡是自动发生的,群集中的每个节点都会尽快启动作业。当触发器的触发时间发生时,第一个获得锁的节点将触发它。
接下来,我们需要让Spring使用SchedulerFactoryBean管理Quartz调度程序的创建。此外,从application.yml加载所有属性
接下来是要执行的作业。请注意,除非必要且与作业本身相关,否则建议不要添加任何业务逻辑。
最后,让我们定义乔布斯及其触发器。
最后,在作业执行时要调用的服务:
现在运行Spring Boot应用程序时,您应该看到创建了以下集合:
注意:如果您想拥有自定义的工作存储,则可以阅读本文。
如果您读了那么多文章,则意味着您喜欢这篇文章。谢谢你。
原文链接:http://codingdict.com