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配置-------------------------------------------------------------------------------
<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>
</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>
<property name="triggers">
<list>
<ref local="cronTrigger_1" />
<ref local="cronTrigger_2" />
</list>
</property>
</bean>