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