spring-boot 定時任務之Scheduled Task

Spring boot定時器之Scheduled Task

Scheduled task是Spring 內置的一個定時器,他可以不想Quartz那樣麻煩的配置;Scheduled task有三種使用的方式,一種是在註解上直接使用task定時任務,第二種是可以進行更改定時任務的時間,第三種是可以進行手動啓動定時任務和停止定時任務以及更改定時任務的時間;

第一種,spring-boot使用註解的方式實現定時任務

/**
 * spring boot時間調度器
 * @author Admin
 *
 */
@Configuration
@EnableScheduling
public class MyTask {

	/**
	 * 每一秒中執行以下改方法
	 * cron是用來指定執行的 秒,分鐘,日期等
	 */
	@Scheduled(cron="0/10 * * * * *")
	public void test1(){
		System.out.println("test1");
	}
}
第二種:可以更改任務執行的時間
empty@RestController
@EnableScheduling
public class ChangeTask implements SchedulingConfigurer{
	//時間:秒,分鐘,小時,日期,月份,星期,年
	private String expression="0/5 * * * * *";

	//編寫更改調度時間的方法
	@RequestMapping("change")
	public String changeExpression(){
		 expression="0/10 * * * * *";
		 return "changeExpression";
	}
	
	
	@Override
	public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
		//定時任務要執行的方法	
		Runnable task=new Runnable() {
				@Override
				public void run() {
					System.out.println("changeTask"+new Date());
				}
			};
			/**
			 * 調度實現的時間控制
			 */
		Trigger trigger=new Trigger() {
			@Override
			public Date nextExecutionTime(TriggerContext triggerContext) {
				CronTrigger cronTrigger=new CronTrigger(expression);
				return cronTrigger.nextExecutionTime(triggerContext);
			}
		};
		scheduledTaskRegistrar.addTriggerTask(task, trigger);
	}

}
第三種可以手動啓動或者終止定時任務獲取更改定時任務執行的時間
empty/**
 * 利用線程池實現任務調度
 * Task任務調度器可以實現任務的調度和刪除
 * 原理:
 * 實現一個類:ThreadPoolTaskScheduler線程池任務調度器,能夠開啓線程池進行任務調度
 * ThreadPoolTaskScheduler.schedule()方法會創建一個定時計劃ScheduleFuture,
 * 在這個方法中添加兩個參數一個是Runable:線程接口類,和CronTrigger(定時任務觸發器)
 * 在ScheduleFuture中有一個cancel可以停止定時任務
 * @author Admin
 * 
 * Scheduled Task是一種輕量級的任務定時調度器,相比於Quartz,減少了很多的配置信息,但是Scheduled Task
 * 不適用於服務器集羣,引文在服務器集羣下會出現任務被多次調度執行的情況,因爲集羣的節點之間是不會共享任務信息的
 * 每個節點的定時任務都會定時執行
 *
 */
@RestController
@EnableScheduling
public class DynamicTask {

	@Autowired
	private ThreadPoolTaskScheduler threadPoolTaskScheduler;
	
	private ScheduledFuture<?> future;
	
	@Bean
	public ThreadPoolTaskScheduler trPoolTaskScheduler(){
		return new ThreadPoolTaskScheduler();
	} 
	/**
	 * 1,定義一個方法實現定時任務的啓動
	 * 2,定義一個方法實現用於終止定時任務
	 * 3,修改定時任務時間:changeCron
	 */
	/**
	 * 啓動定時器
	 * @return
	 */
	@RequestMapping("startTest")
	public String StartTest(){
		/**
		 * task:定時任務要執行的方法
		 * trigger:定時任務執行的時間
		 */
		future=threadPoolTaskScheduler.schedule(new myRunable(),new CronTrigger("0/5 * * * * *") );
		
		return "startTest";
	}
	
	/**
	 * 停止定時任務
	 * @return
	 */
	@RequestMapping("endTask")
	public String endTask(){
		if(future!=null){
			future.cancel(true);
		}
		System.out.println("endTask");
		return "endTask";
	}
	
	/**
	 * 改變調度的時間
	 * 步驟:
	 * 1,先停止定時器
	 * 2,在啓動定時器
	 */
	@RequestMapping("changeTask")
	public String changeTask(){
		//停止定時器
		endTask();
		//定義新的執行時間
		future=threadPoolTaskScheduler.schedule(new myRunable(),new CronTrigger("0/10 * * * * *") );
		//啓動定時器
		StartTest();
		System.out.println("changeTask");
		return "changeTask";
	}
	
	/**
	 * 定義定時任務執行的方法
	 * @author Admin
	 *
	 */
	public class myRunable implements Runnable{
		@Override
		public void run() {
			System.out.println("定時任務要執行的方法"+new Date());
		}
		
	}
	
	}

使用Scheduled Task的弊端就是不適用於分佈式集羣的操作,Scheduled Task是一種輕量級的任務定時調度器,相比於Quartz,減少了很多的配置信息,但是Scheduled Task不適用於服務器集羣,引文在服務器集羣下會出現任務被多次調度執行的情況,因爲集羣的節點之間是不會共享任務信息的,每個節點的定時任務都會定時執行




發佈了35 篇原創文章 · 獲贊 29 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章