在项目中经常会碰到定时执行的任务,且执行什么任务,及任务执行的时间都由用户自定义的需求。quartz是比较常用的定时器工具,并且在spring框架中也已经做了很好的集成,所以在以spring+hibernate+struts的主流架构中,我们可以采用quartz来做定时器任务的解决方案,下面,我们来看下如何在项目中使用quartz来做动态多任务定时器功能。
这是xml中配置信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 被执行类 -->
<bean id="testQuarzt" class="cmcc.gz.pmp.timetest.service.ScheduleInfoService">
<property name="scheduler" ref="schedulerFactory" />
</bean>
<!-- 将testQuarzt注入到job中 -->
<bean id="testQuartzJob"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="testQuarzt" />
<property name="targetMethod" value="loadJob" />
<property name="concurrent" value="false" />
</bean>
<!-- 将job注入到定时触发器 -->
<bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="testQuartzJob" />
<property name="cronExpression">
<value>0/1 * * * * ?</value>
</property>
</bean>
<!-- 将触发器注入任务工程 -->
<bean id="schedulerFactory"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="testTrigger" />
</list>
</property>
</bean>
</beans>
初始化时间
<span style="font-family: Arial, Helvetica, sans-serif;"><property name="cronExpression"></span>
<value>0/1 * * * * ?</value></property>
Class:“”,指定任务类
<bean id="testQuarzt" class="cmcc.gz.pmp.timetest.service.ScheduleInfoService">
<property name="scheduler" ref="schedulerFactory" />
</bean>
定时任务代码
public void resetJob(String cronExpression) throws SchedulerException, ParseException {<span style="white-space:pre"></span>//<span style="font-family: Arial, Helvetica, sans-serif;">cronExpression:动态传入的时间</span>
// 运行时可通过动态注入的scheduler得到trigger,注意采用这种注入方式在有的项目中会有问题,如果遇到注入问题,可以采
// 取在运行方法时候,获得bean来避免错误发生。
CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger(
"testTrigger", Scheduler.DEFAULT_GROUP);<span style="white-space:pre"></span>//<span style="font-family: Arial, Helvetica, sans-serif;">testTrigger 需要和下面保持一致,反之则无法注入xml中
</span>String originConExpression = trigger.getCronExpression();
// 如果相等,则表示用户并没有重新设定数据库中的任务时间,这种情况不需要重新rescheduleJob
System.out.println(originConExpression);
if (!originConExpression.equalsIgnoreCase(cronExpression)) {
trigger.setCronExpression(cronExpression);
scheduler.rescheduleJob("testTrigger", Scheduler.DEFAULT_GROUP,trigger);//重新加载配置时间
}
}