集群石英实例安排重复作业?

clustered quartz instances schedule duplicate jobs?

我有一个 Tomcat Web 应用程序 A,它使用 quartz 框架安排作业。它 运行ning 作为 RAM Jobstore 上的一个实例。最近我们计划移动到 JDBC Jobstore 并设置一个集群,这样如果一个实例失败,另一个实例将能够 运行 作业。

这是我的问题:

我的应用程序 A 将扫描与业务相关的数据库 table 并在启动期间和之后每 10 分钟安排一次石英作业。如果我在两个不同的 tomcat 实例上部署两个 A 应用程序,那么将有两组通过 Quartz 调度的重复作业。

我该如何解决这个问题?我是否需要将安排作业的代码部分提取到单独的应用程序中,并确保只部署 1 个实例,以便只安排 1 组作业?但问题就变成了——如果这个实例失败了怎么办?在这种情况下如何实现故障转移?

您可以使任务 "scan a business related database table and schedule quartz jobs during starting up and every 10 minutes afterwards" 本身成为集群石英实例中的 cron 任务。

以下是基于 spring 的解决方案。尽管您可以使用该想法轻松转换为非 spring 解决方案。

每十分钟设置一个 cron 触发器。

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="runMeJob" />
    <property name="cronExpression" value="0 */10 * * * ?" />
</bean>

设置工作。在这里,您将需要一个 class instance in spring context.This class instance 将有一个 public 方法,该方法将在触发触发器时调用。在此方法中,您将编写扫描数据库并安排这些作业的任务。

<bean id="cronJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="yourObject" />
    <property name="targetMethod" value="methodOfThatObject" />     
</bean>

在调度程序中配置触发器和作业

<!--this should be your clustered quartz scheduler-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="jobDetails">
        <list>
            <ref bean="cronJob" />
        </list>
    </property>

    <property name="triggers">
        <list>
        <ref bean="cronTrigger" />
        </list>
    </property>
</bean>