1. 程式人生 > 其它 >springboot quartz動態定時_spring boot實現動態增刪啟停定時任務

springboot quartz動態定時_spring boot實現動態增刪啟停定時任務

技術標籤:springboot quartz動態定時

在spring boot專案中,可以通過@EnableScheduling註解和@Scheduled註解實現定時任務,也可以通過SchedulingConfigurer介面來實現定時任務。但是這兩種方式不能動態新增、刪除、啟動、停止任務。要實現動態增刪啟停定時任務功能,比較廣泛的做法是整合Quartz框架。但是本人的開發原則是:在滿足專案需求的情況下,儘量少的依賴其它框架,避免專案過於臃腫和複雜。檢視spring-context這個jar包中org.springframework.scheduling.ScheduledTaskRegistrar這個類的原始碼,發現可以通過改造這個類就能實現動態增刪啟停定時任務功能。

1223e327818a892e67a24d7cb2896b37.png

定時任務列表頁

0f988e2a22c2b34e50db19ea4790aabb.png

定時任務執行日誌

新增執行定時任務的執行緒池配置類

@Configurationpublic class SchedulingConfig { @Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); // 定時任務執行執行緒池核心執行緒數 taskScheduler.setPoolSize(4); taskScheduler.setRemoveOnCancelPolicy(true); taskScheduler.setThreadNamePrefix("TaskSchedulerThreadPool-"); return taskScheduler; }}

新增ScheduledFuture的包裝類。ScheduledFuture是ScheduledExecutorService定時任務執行緒池的執行結果。

public final class ScheduledTask { volatile ScheduledFuture> future; /** * 取消定時任務 */ public void cancel() { ScheduledFuture> future = this.future; if (future != null) { future.cancel(true); } }}

新增Runnable介面實現類,被定時任務執行緒池呼叫,用來執行指定bean裡面的方法。

public class SchedulingRunnable implements Runnable { private static final Logger logger = LoggerFactory.getLogger(SchedulingRunnable.class); private String beanName; private String methodName; private String params; public SchedulingRunnable(String beanName, String methodName) { this(beanName, methodName, null); } public SchedulingRunnable(String beanName, String methodName, String params) { this.beanName = beanName; this.methodName = methodName; this.params = params; } @Override public void run() { logger.info("定時任務開始執行 - bean:{},方法:{},引數:{}