一、非Spring集成状况:java
任务有并行和串行之分,并行是指:一个定时任务,当执行时间到了的时候,马上执行此任务,无论当前这个任务是否在执行中;串行是指:一个定时任务,当执行时间到了的时候,须要等待当前任务执行完毕,再去执行下一个任务。spring
quartz框架中防止任务并行能够有两种方案:框架
一、若是是经过MethodInvokingJobDetailFactoryBean在运行中动态生成的Job,配置的xml文件有个concurrent属性,这个属性的功能是配置此job是否能够并行运行,若是为false则表示不能够并行运行,不然能够并行。若是一个job的业务处理发费的时间超过了job的启动的间隔时间(repeatInterval),这个属性很是有用。若是为false,那么,在这种状况下,当前job还在运行,那么下一个job只能延时运行。若是为true,那么job就会并行运行。less
<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 >
二、若是是经过自定义要执行的任务的类的名称实现job的话,则有另外一种方式:ide
默认的任务的类实现org.quartz.Job接口,此时任务是stateless(无状态的),即会出现并行的状况,那么如何避免这种状况发生呢?fetch
解决方案:使QuartzJobBean类实现org.quartz.StatefulJob接口便可(StatefulJob接口仅仅是扩展了 Job 接口,未加入新的方法,能够不需实现Job接口了),那么此时任务就会变成stateful(有状态的),此时的任务也就会串行执行了。code
public class BackCoupon implements StatefulJob { @Override public void execute(JobExecutionContext context) throws JobExecutionException { } }
二、与spring集成配置xml
//能够经过在实现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>