Spring对任务调度的支持有两种不同的形式:基于JDK Timer和基于Quartz。
我主要说基于Quartz方面的一个例子。
主要思路:定义任务—->定义调度工作任务—->设置触发器(触发的条件)—->启动job
)
1.定义任务
此处定义的是自定义的任务类,属于业务层范畴。例如:任务类 com.xxx.xxx
在applicationContext.xml中如下配置:
<span style="font-size:14px;"><bean id="testDemo"
class="com.xxx.xxx"></span>
2.定义调度工作任务
Spring通过JobDetailBean,MethodInvokingJobDetailFactoryBean实现对任务调度的定义。
JobDetailBean,
MethodInvokingJobDetailFactoryBean都
是spring对定义的任务类进行调度的代理,但二者有明显的区别。
第一种:JobDetailBean方式。
任务是无状态的,导致多个线程并发执行,产生业务重复操作。
此方式需要设置 jobClass(即你的任务类)和jobDataAsMap(任务类中注入的属性或参数),例如:
在applicationContext.xml中如下配置:
<span style="font-size:14px;"><bean id="autoSendEmailJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.xxx.xxx</value>
</property>
<property name="jobDataAsMap">
<map>
<entry key="userService">
<ref bean="userService" />
</entry>
</map>
</property>
</bean></span>
第二种:MethodInvokingJobDetailFactoryBean方式。
该方式指定concurrent设为
false
,多个job不会并发运行,默认concurrent为
true。
此方式需要设置“targetObject”(任务类)和“targetMethod”(任务类中的方法),例如:
在applicationContext.xml中如下配置:
<bean id="syncSponsorJob"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="webServiceSponsor" />
</property>
<property name="targetMethod">
<value>getSponsorInfo</value>
</property>
<property name="arguments">
<list>
<value>null</value>
</list>
</property>
</bean>
3.设置触发器
需要设置jobDetail(2中定义的任务的调度) 和cronExpression(设置触发时间)
在applicationContext.xml中如下配置:
<bean id="syncSponsorJobCronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="syncSponsorJob" />
</property>
<property name="cronExpression">
<value>0 08 02 * * ?</value>
</property>
</bean>
触发时间的定义如下:
a.触发时间格式:【秒】【分】【时】【日】【月】【周】【年】
b.常用的通配符:
* 表示所有值。例如,在分得字段上设置 “*”,表示每分钟都执行。
?表示不指定值。例如,公司要在每月的10号发放工资,但不关心是周几,此时需要在【周】的位置设置“?”,具体设置为 0 0 0 10 * ?
– 表示区间。例如,在小时位置设置8-10,表示8点,9点,10点都会执行。
,表示指定多个值。例如,在小时的位置指定 8,10,17 表示在8点,10点,17点的时候执行。
/ 表示递增触发。例如,在分得位置设置 1/10,表示从1分开始,每隔10分钟执行一次。
4.启动JOB
可以启动多个job,例如
在applicationContext.xml中如下配置:
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!--
<ref bean="updateDeptJobCronTrigger" />
<ref bean="updateJobCodeJobCronTrigger" />
<ref bean="updateUserJobCronTrigger" />
-->
<ref bean="syncEhrJobCronTrigger" />
<ref bean="syncSponsorJobCronTrigger" />
<ref bean="syncTradeJobCronTrigger" />
<ref bean="syncAgingStatiSticsJobCronTrigger" />
<ref bean="autoCalcJobCronTrigger" />
<ref bean="changeOrderStatusJobCronTrigger" />
</list>
</property>
</bean>