二者区别与做用:java
普通任务:总调度(SchedulerFactoryBean)--> 定时调度器(CronTriggerFactoryBean) --> 调度明细自定义执行方法bean(MethodInvokingJobDetailFactoryBean) -->调度bean(咱们定义的job类)spring
可传参任务:总调度(SchedulerFactoryBean)--> 定时调度器(CronTriggerFactoryBean) --> 调度明细bean(JobDetailFactoryBean)ide
如上是咱们在配置调度器时的具体步骤及相互之间的依赖,区别主要在调度明细bean上,普通任务是(MethodInvokingJobDetailFactoryBean),而可传参任务是(JobDetailFactoryBean):测试
1)普通任务能够自定义执行方法,也就是说在其配置的调度bean(咱们定义的job类)中咱们能够自定义调度器最终执行的方法,能够叫work1也能够叫work2,and so on。并且要记住的一点,必须是无入参的方法!!!(作了一个测试,测试目的是看经过此类型调度类型是否也能传入参数因此定义了一个带入参的自定义方法即public void work(JobExecutionContext jobExecutionContext),最中测试结果是spring quartz会报找不到work方法及No such method work(),其默认执行咱们生命的work无入参的方法。spa
2)可传参任务必须继承QuartzJobBean,重写protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException方法,其中JobExecutionContext就是咱们在定义调度器明细时传入参数的上下文,咱们能够经过JobExecutionContext取出传入的map,调度任务最终执行的就是executeInternal方法,使用该调度明细任务没法使用自定义方法。code
public class NormalJob { /*不会调此方法,若是仅生命此方法会报No such Method work public void work(JobExecutionContext jobExecutionContext){ JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap(); for (Map.Entry entry : jobDataMap.entrySet()){ System.out.println("key Normal ---: " + entry.getKey() + "value Normal---: " + entry.getValue()); } }*/ public void work(){ System.out.println("33333333333333333333333333333333333333"); } }
<!-- 封装工做任务处理的工做类 --> <bean id="quartzJob" class="com.x.x.job.NormalJob" /> <bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" > <property name="targetObject"> <ref bean="quartzJob" /> </property> <property name="targetMethod"> <value>work</value> </property> </bean> <bean id="excuteTime" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail"> <ref bean="jobtask" /> </property> <!--<property name="jobDataMap"> <ref bean="hasReturnData"></ref> </property>--> <property name="cronExpression"> <value>${cron.every10minute}</value> </property> </bean> <!-- 总管理类(调度程序启动模块) 若是将lazy-init="false"那么容器启动就会执行调度程序 --> <bean id="startQuartz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="excuteTime" /> <!--<ref bean="every10minute" />--> </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()); } } }
<bean id="hasReturnParm" class="org.quartz.JobDataMap"> <constructor-arg> <map> <entry key="validateVendorQuotationInterface" value="http://x.x.x.x/validateVendorQuotationInterface" /> <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>