Spring系列-定時任務接口 SchedulingConfigurer


Spring 中,定時任務接口 SchedulingConfigurer

Spring 中,創建定時任務除了使用@Scheduled 注解外,還可以使用 SchedulingConfigurer。

@Schedule 注解有一個缺點,其定時的時間不能動態的改變,而基於 SchedulingConfigurer 接口的方式可以做到。SchedulingConfigurer 接口可以實現在@Configuration 類上,同時不要忘了,還需要@EnableScheduling 注解的支持。

該接口的實現方法如下:

public void configureTasks(ScheduledTaskRegistrar taskRegistrar)

其中 ScheduledTaskRegistrar 類的方法有下列幾種:

從方法的命名上可以猜到,方法包含定時任務,延時任務,基於 Cron 表達式的任務,以及 Trigger 觸發的任務。

下面演示了使用方法。

@Configuration
@ComponentScan(value = "com.learn")
@EnableScheduling
public class Config implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
	taskRegistrar.addFixedRateTask(() -> System.out.println("執行定時任務1: " + new Date()), 1000);
	TriggerTask triggrtTask = new TriggerTask( // 任務內容.lambda表達式
		() -> {System.out.println("執行定時任務2: " + new Date());},
		// 設置觸發器,這里是一個lambda表達式,傳入的TriggerContext類型,返回的是Date類型
		triggerContext -> {
			// 2.3 返回執行周期(Date)
			return new CronTrigger("*/2 * * * * ?").nextExecutionTime(triggerContext);
		});
		taskRegistrar.addTriggerTask(triggrtTask);
	}
}

默認的,SchedulingConfigurer 使用的也是單線程的方式,如果需要配置多線程,則需要指定 PoolSize,加入如下代碼即可:

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
	ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
	taskScheduler.setPoolSize(10);
	taskScheduler.initialize();
	taskRegistrar.setTaskScheduler(taskScheduler);
	}

動態修改定時規則

SchedulingConfigurer 動態修改定時規則,網上有兩種方法,都有缺點。

  1. 一種如下:

https://blog.csdn.net/xht555/article/details/53121962

此方法,是在觸發運行的時候,刷新定時規則,這種方法的缺點是,刷新規則的時間必須是在某次觸發運行的時候。

  1. 另一種是

https://blog.csdn.net/jianggujin/article/details/77937316

此方法基於 SchedulingConfigurer 的源碼,捕獲 ScheduledTaskRegistrar 類的實例,通過該類中的 TaskScheduler 實例操作定時任務的增刪,而非采用 ScheduledTaskRegistrar.addTriggerTask 方法維護定時任務。所以需要自行寫代碼維護定時任務列表,控制任務的刪減,代碼的實現比較繁瑣。

如果想要實現可以動態修改的定時策略,建議使用開源組件 Quartz。


免責聲明!

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



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