在Spring中使用Quartz的顺序作业调度

时间:2015-07-28 05:34:44

标签: java spring spring-mvc quartz-scheduler

在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分钟,因此我不希望在上一个作业完成之前启动下一个消防作业。 如果您有任何疑虑/澄清,请回复我。

提前致谢。

1 个答案:

答案 0 :(得分:0)

要链接作业的执行,您需要实现JobListener。在 jobWasExecuted 事件处理程序中,您需要定义作业链逻辑,以便无论单个作业的执行时间长短,您的作业都按顺序执行。在这种情况下,您只需要触发第一个作业(作业1),因为链接作业(作业2和作业3)将被触发&#34;手动&#34;来自事件处理程序。

您还可以使用JobChainingJobListener实现,使您能够以编程方式在应用程序中定义简单的作业链。要定义您的工作链,您将使用 addJobChainLink 方法。

如果您想要一个强大的解决方案,可以避免硬编码应用程序代码中的作业链逻辑,同时让您通过GUI在运行时修改作业链规则,而无需触摸,重新部署和重新启动应用程序,您可以考虑使用我们的产品QuartzDesk。 QuartzDesk带有一个功能强大的作业链引擎,允许您实现各种常见的作业链方案,包括已链接(目标)作业的计划(即非即时)执行,多个目标作业,本地/远程目标作业等。

enter image description here