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

时间:2015-12-02 20:47:33

标签: java quartz-scheduler load-balancing

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

以下是我的问题:

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

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

1 个答案:

答案 0 :(得分:1)

您可以执行任务"扫描业务相关数据库表并在启动期间和之后每10分钟安排一次石英作业"本身是集群石英实例中的一个cron任务。

以下是基于弹簧的解决方案。虽然您可以轻松地使用这个想法转换为非基于弹簧的解决方案。

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

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

设置工作。在这里,您将需要spring上下文中的类实例。此类实例将具有一个公共方法,该方法将在触发触发器时调用。在此方法中,您将编写任务以扫描数据库并安排这些作业。

<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>