繁体   English   中英

在春季使用Quartz的顺序作业计划

[英]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.javaScheduler2.javaScheduler3.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM