quartz任务并发设置

一、非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>
相关文章
相关标签/搜索