Quartz動態改變任務時間


基於quartz-2.2 的動態任務調度
Quartz是一個完全由java編寫的開源作業調度框架。

調度器
Quartz框架的核心是調度器。調度器負責管理Quartz應用運行時環境。調度器不是靠自己做所有的工作,而是依賴框架內一些非常重要的部件。Quartz不僅僅是線程和線程管理。為確保可伸縮性,Quartz采用了基於多線程的架構。啟動時,框架初始化一套worker線程,這套線程被調度器用來執行預定的作業。這就是Quartz怎樣能並發運行多個作業的原理。Quartz依賴一套松耦合的線程池管理部件來管理線程環境。

今天測試了下基於quartz-2.2動態改變調度時間

<bean id="producer" class="com.springmvc.controller.Producer" />
<bean id="schedulerJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
         <property name="targetObject" ref="producer"/>  
         <property name="targetMethod" value="executeListener"/>  
         <property name="concurrent" value="false"/>  
</bean>                  
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
	<property name="jobDetail" ref="schedulerJobDetail"/>  
	<!-- 10 seconds -->
	<property name="startDelay" value="10000" />
 	<!-- repeat every 5 seconds -->
	<property name="repeatInterval" value="5000" />
</bean>  
<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
        <property name="triggers">  
            <list>  
                <ref local="cronTrigger"/>  
            </list>  
        </property>  
</bean>  

POJO執行任務類

public class Producer {
	public void executeListener() {
    	System.out.println("執行任務 ,當前執行時間 :: " + (new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date()));
    }
}

隨機一個數,測試執行的時間

@Controller
@RequestMapping("/")
public class ScheduleInfoAction {

	@Autowired
	org.springframework.scheduling.quartz.SchedulerFactoryBean myScheduler;
	@Autowired
	org.springframework.scheduling.quartz.SimpleTriggerFactoryBean oldTrigger;

	@RequestMapping(value="/rereshSheduleTrigger",method=RequestMethod.GET)
	public void retScheduleJob() throws SchedulerException, ParseException {
		TriggerBuilder<SimpleTrigger> tb = oldTrigger.getObject().getTriggerBuilder();
		int number = new Random().nextInt(10) + 1;
		System.out.println("動態改變執行時間為"+number+"秒");
		Trigger newTrigger = tb.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(number)).build();
		//Trigger trigger = tb.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build();
		myScheduler.getObject().rescheduleJob(oldTrigger.getObject().getKey(), newTrigger);
	}
}

測試圖如下,默認是5秒鍾執行一次,加了個隨機數讓任務隨機執行。
這里我用了SimpleScheduleBuilder。也可以用CronScheduleBuilder 這樣就可以用cron表達式來實現。


免責聲明!

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



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