1、非Spring集成情况:
任务有并行和串行之分,并行是指:一个定时任务,当执行时间到了的时候,立刻执行此任务,不管当前这个任务是否在执行中;串行是指:一个定时任务,当执行时间到了的时候,需要等待当前任务执行完毕,再去执行下一个任务。
quartz框架中防止任务并行可以有两种方案:
1、如果是通过MethodInvokingJobDetailFactoryBean在运行中动态生成的Job,配置的xml文件有个concurrent属性,这个属性的功能是配置此job是否可以并行运行,如果为false则表示不可以并行运行,否则可以并行。如果一个job的业务处理发费的时间超过了job的启动的间隔时间(repeatInterval),这个属性非常有用。如果为false,那么,在这种情况下,当前job还在运行,那么下一个job只能延时运行。如果为true,那么job就会并行运行。
<bean id=" jobCompareB2cAndLocal" class="com.vipshop.management.util.quartz.MethodInvokingJobDetailFactoryBean ">
<property name="targetObject " ref="delegateJob " />
<property name="targetMethod " value="方法名" />
<property name="concurrent " value="false "></property >
</bean >
2、如果是通过自定义要执行的任务的类的名称实现job的话,则有另一种方式:
默认的任务的类实现org.quartz.Job接口,此时任务是stateless(无状态的),即会出现并行的情况,那么如何避免这种情况发生呢?
解决方案:使QuartzJobBean类实现org.quartz.StatefulJob接口即可(StatefulJob接口仅仅是扩展了 Job 接口,未加入新的方法,可以不需实现Job接口了),那么此时任务就会变成stateful(有状态的),此时的任务也就会串行执行了。
public class BackCoupon implements StatefulJob {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
}
}
2、与spring集成配置
//可以通过在实现Job接口的类上加注解的方式
@DisallowConcurrentExecution
public class TestJob implements Job{
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("test");
}
}
2. quartz与spring集成,设置配置文件concurrent参数为false
<bean id="fetchOneJob" class="hm.com.job.FetchDataFromOrgJDBC"/>
<bean id="fetchOneJobTask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="concurrent" >
<value>false</value>
</property>
<property name="targetObject">
<ref bean="fetchOneJob" />
</property>
<property name="targetMethod">
<value>work</value>
</property>
</bean>
<bean id="fetchOneJobTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="fetchOneJobTask" />
</property>
<property name="cronExpression">
<value>0 0/3 * * * ?</value>
</property>
</bean>
<bean id="startFetchOneJobTime" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="fetchOneJobTime" />
</list>
</property>
</bean>