集群石英实例安排重复作业?
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>
我有一个 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>