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:大多是参考 并记录一下!

转载于:https://www.cnblogs.com/flying-dream/p/6625816.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值