之前写的那篇定时执行任务的时间是在xml中配置好了的,如果在程序中由于某些需求要动态的去改变执行的时间,可以进和如下的配置
以下是我的执行操作类:意思为如果dbCronExpression的时间与originConExpression的时间不一致,则重新设置定时任务的时间为dbCronExpression
import org.apache.log4j.Logger;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.scheduling.quartz.CronTriggerBean;
import java.text.ParseException;
import java.util.Date;
public class ScheduleInfoAction {
Logger logger = Logger.getLogger(ScheduleInfoAction.class);
private Scheduler scheduler;
// 设值注入,通过setter方法传入被调用者的实例scheduler
public void setScheduler(Scheduler scheduler) {
this.scheduler = scheduler;
}
public void reScheduleJob() throws SchedulerException {
// 运行时可通过动态注入的scheduler得到trigger,注意采用这种注入方式在有的项目中会有问题,如果遇到注入问题,可以采取在运行方法时候,获得bean来避免错误发生。
CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger(
"cronTrigger", Scheduler.DEFAULT_GROUP);
logger.info("*********** trigger: " + trigger);
String dbCronExpression = "10,15,20,25,30,35,40,45,50,55 * * * * ?";
//每10s执行一次;
//String dbCronExpression = "0/10 * * * * ?";
logger.info("*********** dbCronExpression: " + dbCronExpression);
String originConExpression = trigger.getCronExpression();
logger.info("*********** originConExpression: " + originConExpression);
// 判断从DB中取得的任务时间(dbCronExpression)和现在的quartz线程中的任务时间(originConExpression)是否相等
// 如果相等,则表示用户并没有重新设定数据库中的任务时间,这种情况不需要重新rescheduleJob
if (!originConExpression.equalsIgnoreCase(dbCronExpression)) {
logger.info("*********** 执行时间: 不相等");
// 如果触发时间不相同
try {
trigger.setCronExpression(dbCronExpression);
scheduler.rescheduleJob("cronTrigger", Scheduler.DEFAULT_GROUP,
trigger);
} catch (ParseException e) {
logger.error("------------------- ParseException Error! -------------------");
e.printStackTrace();
logger.error("-------------------------------------------------------------");
}
}
// 执行task
logger.info("task start time: " + new Date());
System.out.println("red stone 工作了!");
logger.info(" task end time: " + new Date());
}
}
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="scheduleInfoAction" class="ScheduleInfoAction">
<property name="scheduler" ref="schedulerFactory" />
</bean>
<bean id="jobtask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="scheduleInfoAction" />
<property name="targetMethod" value="reScheduleJob" />
<property name="concurrent" value="false" />
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobtask" />
<!-- 默认的时间为 -->
<property name="cronExpression">
<value>0/10 * * * * ?</value>
</property>
</bean>
<bean id="schedulerFactory"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean>
</beans>
此文参考:http://ithead.iteye.com/blog/1460748;之前的文章中有maven配置好的jar