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 ");
}
}
}
提前谢了。
为了将作业的执行链起来,您需要实现一个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。