当前位置: 首页 > 知识库问答 >
问题:

Spring使用Quartz的顺序作业计划

薛经纶
2023-03-14

Spring使用Quartz的顺序作业计划

我有三个或更多的工作,这取决于他们各自以前的工作,他们将按顺序运行。如果作业1完成作业2运行,当作业2完成作业3运行。如果在上一个作业中发生任何错误,则不会激发下一个触发的作业。我试图了解工作链使用石英,但无法通过它。

作业顺序如下所示

Job 1 -> Job 2 -> Job 3
<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>
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个答案

范京
2023-03-14

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

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

如果您想要一个健壮的解决方案,该解决方案将允许您避免在应用程序代码中硬编码作业链接逻辑,同时允许您在运行时通过GUI修改作业链接规则,而无需触摸、重新部署和重新启动应用程序,您可以考虑使用我们的产品QuartzDesk。QuartzDesk提供了一个强大的作业链接引擎,允许您实现各种常见的作业链接场景,包括调度(即,不是立即)执行链接(目标)作业、多个目标作业、本地/远程目标作业等。

 类似资料:
  • 我有以下触发器配置: 我的工作可能超过5秒。 可行吗? 谢谢

  • 我正在利用石英调度,有2个工作。第一个工作是执行大约2分钟的任务,第二个是设置为临时文件的清理操作。因此,我需要设置时间表,以一种方式工作,即在第一个作业被执行/完成执行任务后,我需要在第二个作业的帮助下进行清洁操作。 考虑到Quartz 2.1.x下的示例9-Job Listeners,该示例说明我们可以定义一个名为jobWasExecuted(_,_)的方法;并在第一个作业被执行/或处于运行状

  • Job1在org.eko.businessjobs.Job1.doperform(Job1.java:23)在org.eko.jobs.businessjoba.executeinternal(businessjoba.java:34)在org.springframework.scheduling.quartz.quartzjobbean.execute(quartzjobbean.java:75

  • 我想使用Quartz、Spring和Hibernate创建动态作业。用户与web服务交互以创建此类作业: NoaJobInstancesDAO是一个简单的DAO类,它利用了Hibernate的EntityManager: 问题是,当这个作业触发时,会抛出一个异常: 我不明白为什么!在Manager类中,我以这种方式安排作业 其中排定程序作为 Edit1:应用程序上下文的实例似乎正确。问题不可能在那

  • : 是一个从Hibernate获取数据的经典Spring服务。正如我上面所说的,在我搬到Spring Boot之前,这一直很有效。 当我用经典的Spring应用程序实现这段代码时,完成了对服务的自动化操作。

  • 问题内容: 我正在使用Quartz Job执行特定任务。 我也在我的Main应用程序类中安排它的执行,而我试图完成的工作是不允许同时执行此作业的实例。 因此,调度程序仅应在其先前实例完成后才执行作业。 这是我的工作班级: 因此,在应用程序的主类中,我正在启动调度程序: 如果另一个实例仍在运行,我想阻止调度程序启动第二个MainJob实例… 问题答案: 只需在Job类顶部使用Annotation。