天天看點

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

第二種:可以更改任務執行的時間

[email protected]
@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不适用于伺服器叢集,引文在伺服器叢集下會出現任務被多次排程執行的情況,因為叢集的節點之間是不會共享任務資訊的,每個節點的定時任務都會定時執行

繼續閱讀