在Spring中使用Quartz的顺序作业计划
我有三个或更多的工作,这取决于他们各自以前的工作,他们将按顺序运行。如果Job 1
完成Job 2
运行,Job 2
完成Job 3
运行。如果在之前的Job
中发生任何错误,则不会触发下一次触发的作业。我尝试使用 quartz 了解作业链,但无法通过。
作业序列如下
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 的计划类定义如下。
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分钟,因此我不希望在上一个作业完成之前启动下一个消防作业。 如果您有任何疑虑/澄清,请回复我。
提前致谢。
答案 0 :(得分:0)
要链接作业的执行,您需要实现JobListener。在 jobWasExecuted 事件处理程序中,您需要定义作业链逻辑,以便无论单个作业的执行时间长短,您的作业都按顺序执行。在这种情况下,您只需要触发第一个作业(作业1),因为链接作业(作业2和作业3)将被触发&#34;手动&#34;来自事件处理程序。
您还可以使用JobChainingJobListener实现,使您能够以编程方式在应用程序中定义简单的作业链。要定义您的工作链,您将使用 addJobChainLink 方法。
如果您想要一个强大的解决方案,可以避免硬编码应用程序代码中的作业链逻辑,同时让您通过GUI在运行时修改作业链规则,而无需触摸,重新部署和重新启动应用程序,您可以考虑使用我们的产品QuartzDesk。 QuartzDesk带有一个功能强大的作业链引擎,允许您实现各种常见的作业链方案,包括已链接(目标)作业的计划(即非即时)执行,多个目标作业,本地/远程目标作业等。