之前没有使用框架开发时对于开发定时任务都是 使用java的原声timer类,重写线程的run方法跑要执行的任务。刚刚换的新公司,项目使用ssh2,目前该项目中的定时任务的使用spirng集成的quartz工具,非常方便。好了,废话不多说,说一下开发过程。
首先,需要建一个资源配置xml文件,一般以quartz结尾。如我项目中的该文件名为:applicationContext-bms-sendxml-quartz.xml,别忘了在applicationContext.xml文件中导入该文件。applicationContext-bms-sendxml-quartz.xml文件配置如下
1.配置调度工厂,这个bean是生成spring集成quartz的工具类org.springframework.scheduling.quartz.SchedulerFactoryBean的对象,用于管理调度对象。
<!-- 配置调度工厂 --> <bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="ContentInjectResponseTrigger" /> </list> </property> </bean>
2.配置调度任务。这个调度任务有两个不同的实现类,分别是org.springframework.scheduling.quartz.SimpleTriggerBean和org.springframework.scheduling.quartz.CronTriggerBean,区别为:
SimpleTrigger:当需要在规定的时间执行一次或在规定的时间段以一定的时间间隔重复触发执行Job时,
CronTriggerBean: CronTrigger 支持比 SimpleTrigger 更具体的调度,而且也不是很复杂。基于 cron 表达式,CronTrigger 支持类似日历的重复间隔,而不是单一的时间间隔。具体配置如下
采用org.springframework.scheduling.quartz.SimpleTriggerBean:
<bean id="CheckAssetStatusTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="jobAssetStatusCheck" /> <property name="startDelay" value="60000" /> <!-- 调度工厂实例化后,经过0秒开始执行调度 --> <property name="repeatInterval" value="600000" /> <!-- 每5分钟调度一次 --> </bean>
采用org.springframework.scheduling.quartz.CronTriggerBean:
<bean id="ContentInjectResponseTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="cronExpression"> <value>${QueryContentResponseCronExpression}</value> </property> <property name="jobDetail" ref="autoQueryContentResponseJob"/> </bean>
如上代码中的cronExpression参数就是配置任务时间参数,具体见我关于两个触发器的其他博文
3.配置具体的调度事项,即上面代码的autoQueryContentResponseJob类
<bean id="autoQueryContentResponseJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <bean class="com.avit.mmsp.common.message.CallBackInjectResultJob"/> </property> <property name="targetMethod" value="execute"/> <property name="concurrent" value="false"/> </bean>
targetObject为目标类,targetMethod即为任务执行方法。concurrent参数表示是否并发调度,false表示不并发。好了,看看这个任务实现类和实现方法:
package com.avit.mmsp.common.message; import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import com.avit.mmsp.common.datasource.CustomerContextHolder; import com.avit.mmsp.common.message.service.ContentInjectResponseService; public class CallBackInjectResultJob { private static Logger log = LoggerFactory.getLogger(SendMessageJob.class); @Inject private ContentInjectResponseService contentInjectResponseService; public void execute() { CustomerContextHolder.setCustomerType(CustomerContextHolder.CMS_DATA_SOURCE); try { log.info("查询内容注入结果开始"); contentInjectResponseService.injectResponse(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
具体的实现就不贴出来了。over,如有异议可留言交流