javascript
一篇文章搞定,SpringBoot 创建定时任务
序言:創建定時任務非常簡單,主要有兩種創建方式:
一、基于注解(@Scheduled)
二、基于接口(SchedulingConfigurer). 前者相信大家都很熟悉,但是實際使用中我們往往想從數據庫中讀取指定時間來動態執行定時任務,這時候基于接口的定時任務就大派用場了。
一、靜態定時任務(基于注解)
基于注解來創建定時任務非常簡單,只需幾行代碼便可完成。
@Scheduled 除了支持靈活的參數表達式cron之外,還支持簡單的延時操作,例如 fixedDelay ,fixedRate 填寫相應的毫秒數即可。
@Configuration?//1.主要用于標記配置類,兼備Component的效果。 @EnableScheduling?//?2.開啟定時任務 public?class?SimpleScheduleConfig?{//3.添加定時任務@Scheduled(cron?=?"0/5?*?*?*?*??")private?void?configureTasks()?{System.err.println("執行定時任務1:?"?+?LocalDateTime.now());} }Cron表達式參數分別表示:
秒(0~59) 例如0/5表示每5秒
分(0~59)
時(0~23)
月的某天(0~31) 需計算
月(0~11)
周幾( 可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT)
啟動應用,可以看到控制臺的信息如下:
誠然,使用Scheduled 確實很方便,但缺點是當我們調整了執行周期的時候,需要重啟應用才能生效,這多少有些不方便。為了達到實時生效的效果,可以使用接口來完成定時任務。
二、動態定時任務(基于接口)
為了演示效果,這里選用 Mysql數據庫 和 Mybatis 來查詢和調整定時任務的執行周期,然后觀察定時任務的執行情況。
1.引入依賴
????<!--依賴管理?--><dependencies><dependency><!--添加Web依賴?--><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><!--添加Mybatis依賴?--><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.1</version></dependency><dependency><!--添加MySql依賴?--><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><!--添加Test依賴?--><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>2.添加數據庫記錄
在Navicat 連接本地數據庫,隨便打開查詢窗口,然后執行腳本內容,如下:
DROP?DATABASE?IF?EXISTS?`socks`; CREATE?DATABASE?`socks`; USE?`SOCKS`; DROP?TABLE?IF?EXISTS?`cron`; CREATE?TABLE?`cron`??(`cron_id`?varchar(30),`cron`?varchar(30)? ); INSERT?INTO?`cron`?VALUES?('1',?'0/5?*?*?*?*??');image
然后在項目中的application.yml 添加數據源:
#application.yml?配置如下: spring:datasource:url:?jdbc:mysql://localhost:3306/socks?useSSL=falseusername:?rootpassword:?root3.創建定時器
數據庫準備好數據之后,我們編寫定時任務,注意這里添加的是TriggerTask,目的是循環讀取我們在數據庫設置好的執行周期,以及執行相關定時任務的內容。具體代碼如下:
@Configuration @EnableScheduling public?class?CompleteScheduleConfig?implements?SchedulingConfigurer?{@Mapperpublic?interface?CronMapper?{@Select("select?cron?from?cron?limit?1")String?getCron();}@Autowired@SuppressWarnings("all")CronMapper?cronMapper;/***?執行定時任務.*/@Overridepublic?void?configureTasks(ScheduledTaskRegistrar?taskRegistrar)?{taskRegistrar.addTriggerTask(//1.添加任務內容(Runnable)()?->?System.out.println("執行定時任務2:?"?+?LocalDateTime.now().toLocalTime()),//2.設置執行周期(Trigger)triggerContext?->?{//2.1?從數據庫獲取執行周期String?cron?=?cronMapper.getCron();//2.2?合法性校驗.if?(StringUtils.isEmpty(cron))?{//?Omitted?Code?..}//2.3?返回執行周期(Date)return?new?CronTrigger(cron).nextExecutionTime(triggerContext);});}}4. 動態修改執行周期
啟動應用后,查看控制臺,打印時間是我們預期的每5秒一次:
image然后打開Navicat ,將執行周期修改為每1秒執行一次,如圖:
image查看控制臺,發現執行周期已經改變,并且不需要我們重啟應用,十分方便。如圖:
image添加我私人微信
置頂或星標公眾號,第一時間接收小海熱文
方法如下
總結
以上是生活随笔為你收集整理的一篇文章搞定,SpringBoot 创建定时任务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 22道Java面试题,看看你会了多少?
- 下一篇: activiti的processEngi