Spring-quartz 可傳參(包括service注入)任務調度 多個任務調度


1 JobDetail 

注意:一個JobDetail中 只能觸發一個方法,如果要調度多個任務 需要有多個job類!

普通任務:總調度(SchedulerFactoryBean)--> 定時調度器(CronTriggerFactoryBean) --> 調度明細自定義執行方法bean(MethodInvokingJobDetailFactoryBean) -->調度bean(我們定義的job類)

可傳參任務:總調度(SchedulerFactoryBean)--> 定時調度器(CronTriggerFactoryBean) -->  調度明細bean(JobDetailFactoryBean)

 

如上是我們在配置調度器時的具體步驟及相互之間的依賴,區別主要在調度明細bean上,普通任務是(MethodInvokingJobDetailFactoryBean),而可傳參任務是(JobDetailFactoryBean):

  1)普通任務可以自定義執行方法,也就是說在其配置的調度bean(我們定義的job類)中我們可以自定義調度器最終執行的方法,可以叫work1也可以叫work2,and so on。而且要記住的一點,必須是無入參的方法!!!(做了一個測試,測試目的是看通過此類型調度類型是否也能傳入參數所以定義了一個帶入參的自定義方法即public void work(JobExecutionContext jobExecutionContext),最中測試結果是spring quartz會報找不到work方法及No such method work(),其默認執行我們生命的work無入參的方法。

  2)可傳參任務必須繼承QuartzJobBean,重寫protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException方法,其中JobExecutionContext就是我們在定義調度器明細時傳入參數的上下文,我們可以通過JobExecutionContext取出傳入的map,調度任務最終執行的就是executeInternal方法,使用該調度明細任務無法使用自定義方法。

-------------------------------------------------------------------------- Spring配置-------------------------------------------------------------------------------

 用的spring,需要在XML里面往JobDetailBean注入一個org.quartz.JobDataMap作為參數.在類里面可以直接取出來.(如果不用spring,可以直接配置job-data-map)
 
參數:
如果需要注入service 則:<entry key="testService" value-ref="testService" />
job類中:@autowired
     TestService testService
在重寫的 protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException 方法中
  protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
 
   JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();    
 
  testService =(TestService ) jobDataMap .get("testService");  //取Service 一定要在方法外@autowired
 
  int one= jobDataMap.getInt("one"); //取普通參數
}
 
另外:使用這種方法配置jobDetail時 一定要加下面這行屬性
<property name="durability" value="true" />
  
<bean id= "hasReturnParm"  class = "org.quartz.JobDataMap" >
     <constructor-arg>
         <map>
             <entry key= "one"  value= "1"  />
             <entry key= "validateComparsionInterface"  value= "http://x.x.x.x/validateComparsionInterface"  />
         </map>
     </constructor-arg>
</bean>
<bean id= "hasReturnJobDetail"  class = "org.springframework.scheduling.quartz.JobDetailFactoryBean" >
     <property name= "jobClass"  value= "com.x.x.CanTransferParm"  />
     <property name= "jobDataMap" >
         <ref bean= "hasReturnParm" ></ref>
  </property>
<property name="durability" value="true" />  
</bean>
 
<bean id= "every5minute"  class = "org.springframework.scheduling.quartz.CronTriggerFactoryBean" >
     <!-- 工作類bean -->
     <property name= "jobDetail" >
         <ref bean= "hasReturnJobDetail"  />
  </property>
     <!-- cron表達式 -->
     <property name= "cronExpression" >
         <value>${cron.every5minute}</value>
     </property>
</bean>
 
<bean id= "startQuartz"  lazy-init= "false"  autowire= "no"  class = "org.springframework.scheduling.quartz.SchedulerFactoryBean" >
     <property name= "triggers" >
         <list>
             <ref bean= "every5minute"  />
         </list>
     </property>
</bean>
 
多個任務調度時候的總調度SchedulerFactoryBean 這樣寫就可以啦!
<bean   class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
   <property name="triggers">
    <list>
     <ref local="cronTrigger_1" />
     <ref local="cronTrigger_2" />
    </list>
   </property>
</bean>
 
------------------------------------------------------------------定時任務類------------------------------------------------------------------------------------------------------
 
public class CanTransferParm extends QuartzJobBean{
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
        for (Map.Entry entry : jobDataMap.entrySet()){
            System.out.println("key---: " + entry.getKey() + "value---: " + entry.getValue());
        }
    }
}
--------------------------------------------------------------------SpringMVC配置---------------------------------------------------------------------------------------------------
<import resource="spring-context-task.xml"/>   使用SSM時 一定要引入這一行!不然定時器不起作用!
PS:大多是參考 並記錄一下!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM