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");
}
}