Quartz總結(四):動態修改定時器二


前文: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); } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM