动态改变Cron表达式,来实现动态执行Spring定时任务



spring定时器非常强大,但是有时候我们需要在不需要重启应用就可以动态的改变Cron表达式的值。这样我们可以在配置文件中写一个表达式的值。每次想改变表达式的值的时候手动修改配置文件中的表达式,实现动态表达式。但是我们也可以从数据库中动态读取,都是一样的。

一:首先定义一个类,这个类用于被定时器调度,这个类不需要继承任何类或者接口。

MyJob.java

package quartz2;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Scheduler;
import org.springframework.scheduling.quartz.CronTriggerBean;
public class MyJob {
	private Scheduler scheduler;
	private static int step=0;
	public void setScheduler(Scheduler scheduler) {
		this.scheduler = scheduler;
	}
	/**
	 * 定时调用此方法
	 * @throws Exception
	 */
	public void doSomething() throws Exception {
		System.out.println("***********************"+step+"***********************");
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String str=df.format(new Date());
		System.out.println("time:"+str);
		if(step==1){
			//满足特定的条件  调用此方法 重设表达式 重新开启新的任务 
			//表达式可以根据需求从配置文件 或者数据库中读取
			resetJob("0/10 * * * * ?");
		}
		step++;
	}
	/**
	 * 重设定时器表达式
	 * @param cronExpression
	 * @throws Exception
	 */
	public void resetJob(String cronExpression) throws Exception {
		CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger("myTrigger", Scheduler.DEFAULT_GROUP);
		String oldConExpression = trigger.getCronExpression(); 
		if (!oldConExpression.equalsIgnoreCase(cronExpression)) {
			trigger.setCronExpression(cronExpression);
			scheduler.rescheduleJob("myTrigger", Scheduler.DEFAULT_GROUP, trigger);
		}
	}
}

spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
	<bean id="myJob" class="quartz2.MyJob" >
		<property name="scheduler" ref="schedulerFactory" />
	</bean>
	<bean id="myQuartzJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">    
		<property name="targetObject" ref="myJob" />    
		<property name="targetMethod" value="doSomething" />    
		<property name="concurrent" value="false" />
	</bean>
	<bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">       
		<property name="jobDetail" ref="myQuartzJob" />
		<property name="cronExpression">           
			<value>0/20 * * * * ?</value>       
		</property>   
	</bean>
	<bean name="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">    
		<property name="triggers">      
			<list>            
				<ref bean="myTrigger" /> 
			</list>    
		</property>
	</bean>
</beans>

客户端代码

Config.java

package quartz2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Config {
	public static void main(String[] args) {
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");  
	}
}





你可能感兴趣的:(spring,定时器)