动态改变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配置文件



	
		
	
	    
		    
		    
		
	
	       
		
		           
			0/20 * * * * ?       
		   
	
	    
		      
			            
				 
			    
		
	

客户端代码

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)