日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

boot定时任务开启和关闭 spring_Spring之定时任务实践

發布時間:2025/3/11 javascript 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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個字段組成,使用空格進行分隔

  • 秒: 取值范圍: 0~59
  • 分: 取值范圍: 0~24
  • 時: 取值范圍: 0~23
  • 日: 取值范圍: 1~31
  • 月: 取值范圍: 1~12,JAN~DEC(大小寫不敏感)
  • 星期: 取值范圍: 0~7(0為周日,1為周一,...,7為周日),SUN~SAT(大小寫不敏感)
  • 取值表示方法

    • , : 表示該字段多個有效值。即,當'秒'字段為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之定时任务实践的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。