spring quartz动态执行定时任务

之前写的那篇定时执行任务的时间是在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

转载于:https://my.oschina.net/stonezing/blog/115428

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值