前文:http://www.cnblogs.com/LiuChunfu/p/5598806.html 提到了一種動態修改定時器的方法,
其本質就是在job方法中注入Schedular的對象,從Schedular中獲取Trigger(觸發器),然后修改觸發器的條件,重新啟動。
前文中的方法,其實已經涉及到了循環調用。
Job類 => Job => Trigger => Schedular =>Job類。
這樣是很容易發生問題的,也確實在實際項目中發生了問題,特別是當Schedular中有多個trigger的時候,注入實際的Job工作類時候報錯了,產生的原因應該就是因為循環調用的問題。
方法2:
既然我們已經通過在Srping的Bean的XML文件中配置了SchedulerFactory產生的Bean,那么完全可以在實際的Job中通過@Resource或者@Autowired注入,再仔細一思考,仍然不對啊,這個和方法一的循環調用一樣,會出現問題(實際也是)。
此時處理辦法是:懶加載Schdular的類,用到的時候才加載。
代碼如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 要執行任務的任務類。 --> <bean id="testQuartz" class="com.mc.bsframe.job.TestJob"></bean> <!-- 將需要執行的定時任務注入JOB中。 --> <bean id="testJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="testQuartz"></property> <!-- 任務類中需要執行的方法 --> <property name="targetMethod" value="doSomething"></property> <!-- 上一次未執行完成的,要等待有再執行。 --> <property name="concurrent" value="false"></property> </bean> <!-- 基本的定時器,會綁定具體的任務。 --> <bean id="testTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <property name="jobDetail" ref="testJob"></property> <property name="startDelay" value="3000"></property> <property name="repeatInterval" value="200000"></property> </bean> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="testTrigger"></ref> </list> </property> </bean> </beans>
Java代碼:
public class TestJob { @Autowired private TestService testSevice; public void doSomething() { testSevice.sayHi(); System.err.println("****:" + TimeUtils.getCurrentTime()); } @Autowired @Qualifier("scheduler")
@Lazy private Scheduler scheduler; /** * 重置定時任務 * @Title: restJob * @Description: TODO(這里用一句話描述這個方法的作用) * @param @param time * @param @throws Exception * @return void 返回類型 * @throws */ public void restJob(long time) throws Exception { TriggerKey triggerKey = new TriggerKey("testTrigger", Scheduler.DEFAULT_GROUP); SimpleTriggerImpl simpleTrigger = (SimpleTriggerImpl) scheduler.getTrigger(triggerKey); simpleTrigger.setRepeatInterval(time); scheduler.rescheduleJob(triggerKey, simpleTrigger); } }
