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>
相關文章
相關標籤/搜索