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






