javascript
boot定时任务开启和关闭 spring_Spring之定时任务实践
Java下的定時任務實現有Timer,Spring,QuartZ等,這里我們介紹Spring中定時任務的應用,其通過 @Scheduled 注解即可輕松實現
概述
Spring 的定時任務可以支持各種形式的定時調度任務。其通過加在定時方法上的 @Scheduled 注解來配置任務執行周期,還需要在SpringBoot1Application啟動類上添加 @EnableScheduling 注解來使能定時任務(如下所示),否則定時任務將無法執行
@SpringBootApplication@EnableScheduling // 使能定時任務public class SpringBoot1Application {public static void main(String[] args) {SpringApplication app = new SpringApplication(SpringBoot1Application.class);app.run(args);}}@Scheduled(fixedRate = msNum )
fixedRate 指定定時任務開始調用的時間間隔(單位為ms),示例如下所示:定時任務每5s調用一次
@Componentpublic class ScheduledTaskDemo {@Scheduled(fixedRate = 5000)public void scheduledTask1() {System.out.println("Scheduled Task 1 Start: " + new Date());try{Thread.sleep(3000);} catch (Exception e) {System.out.println();}System.out.println("Scheduled Task 1 End: " + new Date());System.out.println();}}從下圖的調用結果可以看出,定時任務如我們所配置的那樣,每5秒調用一次:
@Scheduled(fixedDelay = msNum)
fixedDelay 指定定時任務從本次調用結束到下一次開始調用的時間間隔(單位為ms),示例如下所示:
@Componentpublic class ScheduledTaskDemo {@Scheduled(fixedDelay = 5000)public void scheduledTask2() {System.out.println("Scheduled Task 1 Start: " + new Date());try {Thread.sleep(3000);} catch (Exception e) {System.out.println();}System.out.println("Scheduled Task 2 End: " + new Date());System.out.println();}}定時任務在結束5秒后即開始下一次調用:
cron表達式
Spring的@Scheduled注解同時也支持cron表達式,實現更復雜的定時配置。其由6個字段組成,使用空格進行分隔
取值表示方法
- , : 表示該字段多個有效值。即,當'秒'字段為10,30,50,表示秒為10、30、50時生效
- init/step : init為該字段的有效初值,step為步長。即,當'秒'字段為10/20時,表示秒為10、30(10+20)、50(30+20)時生效,其等同于10,30,50
- - : 表示該字段均有效的取值范圍。即,當'月'字段為1-3,表示月為1、2、3時生效
- * : 表示該字段的所有值均有效。即,當'月'字段為 * ,表示每個月均生效
- ? : 表示該字段無效,只能應用在日和星期字段。由于日和星期字段同時使用會發生沖突,故只能使用一個生效,另一個則使用 ?
cron表達式示例:
13/30 0,3 * * * ? : 每小時的0分13秒、0分43秒、3分13秒、3分43秒 34 2 3-5 * * * ? : 每天的3點2分34秒、4點2分34秒、3點2分34秒 0 0 3 4 5 ? : 每年5月4日的3點0分0秒 0 0 3 ? * 6 : 每月周六的3點0分0秒
測試用例
@Componentpublic class ScheduledTaskDemo {@Scheduled(cron = "11/10 * 16-20 * * ?")public void scheduledTask3() {System.out.println("Scheduled Task 3 Start: " + new Date());try {Thread.sleep(3000);} catch (Exception e) {System.out.println();}System.out.println("Scheduled Task 3 End: " + new Date());System.out.println();}}定時任務在每天的16~20點的11、21、31、41、51秒執行:
與WebSocket集成問題
之前在我的項目中,已經添加WebSocket功能,然后按照上面的配置定時任務后,會啟動失敗,拋出如下異常:
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'defaultSockJsTaskScheduler' is expected to be of type 'org.springframework.scheduling. TaskScheduler' but was actually of type 'org.springframework.beans.factory.support.NullBean'解決方案:
我們需要手動添加一個Scheduled的配置類來創建一個ThreadPoolTaskScheduler對象,此時項目即可成功啟動
@Configurationpublic class ScheduledConfig {@Beanpublic TaskScheduler taskScheduler() {ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();taskScheduler.setPoolSize(10);taskScheduler.initialize();return taskScheduler;}}總結
以上是生活随笔為你收集整理的boot定时任务开启和关闭 spring_Spring之定时任务实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多个python脚本同时执行_Pytho
- 下一篇: java 计算随机数_JAVA获取随机数