[英]Sequential Job Schedule using Quartz in Spring
在春季使用Quartz的顺序作业计划
我有三个或三个以上的作业,具体取决于它们各自以前的作业,它们将按顺序运行。 如果Job 1
完成Job 2
运行,以及Job 2
完成Job 3
运行。 如果上一个Job
发生任何错误,则不会触发下一个触发的作业 。 我试图了解使用石英的 作业链,但无法通过作业链 。
作业顺序如下
Job 1 -> Job 2 -> Job 3
我们按照以下方式在quartz.xml中定义了它们各自的bean
<beans ...>
<bean name="scheduler1"
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass"
value="com.abc.xyz.schedular.Scheduler1" />
<property name="durability" value="true" />
</bean>
<bean id="trigger1"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="scheduler1" />
<property name="cronExpression" value="${scheduler1.cronExpression}" />
</bean>
<bean name="scheduler2"
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass"
value="com.abc.xyz.schedular.Scheduler2" />
<property name="durability" value="true" />
</bean>
<bean id="trigger2"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="scheduler2" />
<property name="cronExpression" value="${scheduler2.cronExpression}" />
</bean>
<bean name="scheduler3"
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass"
value="com.abc.xyz.schedular.Scheduler3" />
<property name="durability" value="true" />
</bean>
<bean id="trigger3"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="scheduler3" />
<property name="cronExpression" value="${scheduler3.cronExpression}" />
</bean>
<bean name="jobScheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="trigger1" />
<ref bean="trigger2" />
<ref bean="trigger3" />
</list>
</property>
<property name="autoStartup" value="${jobScheduler.autoStartup}" />
</bean>
</beans>
在上面的xml文件中,cron表达式如下scheduler1.cronExpression = 0 1 0 * *? , scheduler2.cronExpression = 0 2 0 * *? , scheduler3.cronExpression = 0 3 0 * *? 和jobScheduler.autoStartup = true。
Scheduler1.java , Scheduler2.java , Scheduler3.java的Schedular类在下面定义。
public class Scheduler1 implements Job {
private static final Logger log = (Logger) LogManager
.getLogger(Scheduler.class.getName());
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
try {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
/*
* doing my heavy Process
*/
} catch (Exception e) {
log.error("Error in setExpiredAllPlans Schedular1 ");
}
}
}
public class Scheduler2 implements Job {
private static final Logger log = (Logger) LogManager
.getLogger(Scheduler.class.getName());
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
try {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
/*
* doing my heavy Process
*/
} catch (Exception e) {
log.error("Error in Schedular2 ");
}
}
}
public class Scheduler3 implements Job {
private static final Logger log = (Logger) LogManager
.getLogger(Scheduler.class.getName());
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
try {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
/*
* doing my heavy Process
*/
} catch (Exception e) {
log.error("Error in setExpiredAllPlans Schedular3 ");
}
}
}
现在,我将如何使用上述配置来链接作业,因为有时这些繁琐的过程需要1分钟以上的时间,所以我不想在下一个作业完成之前开始下一个消防工作。 如果您有任何疑问/澄清,请回复我。
提前致谢。
要链接作业的执行,您将需要实现JobListener 。 在其jobWasExecuted事件处理程序中,您将需要定义作业链接逻辑,以使作业按顺序执行,而不管单个作业的执行需要多长时间。 在这种情况下,您只需要为第一个作业(作业1)触发,因为链接的作业(作业2和作业3)将从事件处理程序中“手动”触发。
您还可以使用JobChainingJobListener实现,该实现使您能够以编程方式在应用程序中定义简单的作业链。 要定义您的工作链,您将使用addJobChainLink方法。
如果您想要一个健壮的解决方案,从而避免在应用程序代码中对作业链接逻辑进行硬编码,同时又允许您在运行时通过GUI修改作业链接规则,而无需触摸,重新部署和重新启动应用程序,那么您可以可以考虑使用我们的产品QuartzDesk 。 QuartzDesk带有一个功能强大的作业链引擎,可让您实施各种常见的作业链方案,包括链式(目标)作业的计划(即非立即)执行,多个目标作业,本地/远程目标作业等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.