成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

速看!Spring Boot任務調度你不知道的使用技巧

開發 前端
我們可以通過實現SchedulingConfigurer接口來自定義相關任務調度的設置,這通常用于設置在執行計劃任務時使用的特定TaskScheduler bean,或者以編程方式注冊計劃任務。

環境:SpringBoot3.2.5

1. TaskScheduler接口

Spring 提供了一個TaskSchedulerSPI,其中包含各種用于調度任務的方法,以便在未來某個時間點運行。下面的列表顯示了 TaskScheduler 接口定義:

public interface TaskScheduler {
  ScheduledFuture schedule(Runnable task, Trigger trigger);
  ScheduledFuture scheduleAtFixedRate(Runnable task, Instant startTime, Duration period);
  ScheduledFuture scheduleWithFixedDelay(Runnable task, Instant startTime, Duration delay);
}

上面接口只列出了核心方法。

在SpringBoot環境中,我們可以直接注入該接口,如下示例:

@Resource
private TaskScheduler taskScheduler ;


@PostConstruct
public void initScheduler() {
  this.taskScheduler.schedule(() -> {
    System.out.println("執行任務") ;
  }, new CronTrigger("*/2 * * * * *")) ;
}

上面通過cron表達式控制任務執行周期。你也可以設置固定的執行速率。

this.taskScheduler.scheduleAtFixedRate(() -> {
  System.out.println("固定周期指定任務") ;
}, Duration.ofSeconds(2)) ; // 每2s執行

在默認情況下SpringBoot創建的是ThreadPoolTaskScheduler

坑點:默認情況創建的ThreadPoolTaskScheduler只有一個線程,如果你當前有多個定時任務,如果出現重合那么任務會排隊執行。通過如下參數修改線程池大小

spring:
  task:
    scheduling:
      thread-name-prefix: pack-task
      pool:
        size: 2

這里的spring.task.scheduling.pool.size默認值為:1

2. 基于注解任務調用

基于注解方式實現任務的調用應該是我們工作中應用的主要方式,非常簡單方便,如下示例:

// 以固定的時間間隔執行帶有注釋的方法,該時間間隔從上一次調用結束到下一次調用開始。
@Scheduled(fixedDelay = 2000)
public void fixedDelayTask() throws Exception {
  System.err.printf("Current Time: %s, Current Thread: %s%n", new SimpleDateFormat("HH:mm:ss").format(new Date()), Thread.currentThread().getName()) ;
  TimeUnit.SECONDS.sleep(1) ;
}

輸出結果

圖片

雖然間隔設置為2s,但是實際輸出是3s。

使用corn表達式

@Scheduled(cron = "*/3 * * * * *")
public void task1() {
  // TODO
}

每隔3s執行

響應式支持

從Spring Framework 6.1開始,幾種類型的反應式方法也支持@Scheduled方法:

@Scheduled(fixedRate = 2, timeUnit = TimeUnit.SECONDS)
public Flux<Integer> reactiveTask() {
  return Flux.just(1, 2, 3).doOnNext(System.err::println) ;
}

在上面的示例中,會每隔2s打印1,2,3。

3. Cron表達式

一個格式良好的 cron 表達式(如 * * * * * *)由六個空格分隔的時間和日期字段組成,每個字段都有自己的有效值范圍:

圖片

特別說明:

  • 在范圍(或 *)后面加上 /,表示數字值在范圍內的間隔
  • 用連字符 (-) 分隔的兩個數字表示一個數字范圍。指定的范圍是包含在內的。如(10-15 * * * * *):每分鐘內的10,11,12,13,14,15秒時都會運行
  • 逗號 (,) 用于分隔列表中的項目;如(0 0 6,19 * * *)每天上午 6:00 和下午 7:00

寫cron表達式不太好理解。為了提高可讀性,Spring 支持以下表示常用序列的宏。因此,可以使用這些宏來代替六位數值:@Scheduled(cron = "@hourly")。

描述

@yearly (or @annually)

每年一次 (0 0 0 1 1 *)

@monthly

每月一次 (0 0 0 1 * *)

@weekly

每周一次 (0 0 0 * * 0)

@daily (or @midnight)

每天一次(0 0 0 * * *)

@hourly

每小時一次 (0 0 * * *)

如下示例:

@Scheduled(cron = "@hourly")
public void task2() {
  System.out.println("宏指令執行任務") ;
}

這樣寫簡單多了。

4. 虛擬線程支持

從Spring6.1開始,支持虛擬線程(JDK21)執行任務的調用。在SpringBoot環境下你需要開啟功能:

spring:
  threads:
    virtual:
      enabled: true

如下示例:

@Scheduled(cron = "*/3 * * * * *")
public void scheduler1() throws Exception {
  System.err.printf("當前時間: %s, 當前線程: %s, 是否虛擬線程: %b%n", new SimpleDateFormat("HH:mm:ss").format(new Date()), Thread.currentThread().getName(), Thread.currentThread().isVirtual()) ;
}

輸出結果

圖片圖片

如果使用了虛擬線程,那么下面的配置將沒有任何的意義。

spring:
  task:
    scheduling:
      pool:
        size: 10 #無意義

使用虛擬線程后,任務調用將使用單個調度線程,但每次執行計劃任務時都會啟動一個新線程(虛擬線程)。

5. 自定義任務調度配置

我們可以通過實現SchedulingConfigurer接口來自定義相關任務調度的設置,這通常用于設置在執行計劃任務時使用的特定TaskScheduler bean,或者以編程方式注冊計劃任務。如下示例:

@Component
public class PackSchedulingConfigurer implements SchedulingConfigurer {


  @Override
  public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler() ;
    taskScheduler.setThreadNamePrefix("my-task-") ;
    taskScheduler.afterPropertiesSet();
    taskRegistrar.setTaskScheduler(taskScheduler );
  }
}

上面的示例修改任務調度執行的線程池對象。

public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
  taskRegistrar.addCronTask(() -> {
    System.out.println("動態注冊調度任務...") ;
  }, "*/2 * * * * *");
}

上面示例,通過編程的方式動態注冊調度任務。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2020-08-11 11:20:49

Linux命令使用技巧

2010-03-03 16:26:10

ubantu使用技巧

2019-07-23 17:52:59

Spring BootJava開發

2019-07-23 15:56:56

Spring Boot部署servlet

2022-12-07 08:16:50

Vue 3技巧數組

2015-08-13 09:03:14

調試技巧

2020-01-29 19:40:36

Python美好,一直在身邊Line

2021-01-05 11:22:58

Python字符串代碼

2017-03-02 14:05:42

AndroidAndroid Stu調試技巧

2023-12-21 14:40:09

Python編程語言

2017-07-21 09:48:45

SQL索引查詢

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2009-04-14 21:38:05

LinuxUbuntu技巧

2023-07-07 14:47:46

JavaScript技巧

2020-02-21 14:55:02

Python代碼字符串

2021-01-28 10:04:40

JavaScript開發技術

2024-03-04 00:00:00

Kubernetes技巧API

2022-09-20 11:58:27

NpmNode.js

2022-07-17 06:53:24

微服務架構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本在线网站 | 欧美a级成人淫片免费看 | 国产精品一区二区三区久久 | 成人在线精品视频 | 亚洲黄色在线免费观看 | 中文字幕精品一区久久久久 | 国产成人一区二区 | 国产免费福利 | 国产精品中文字幕在线 | www.788.com色淫免费 | 九九热在线观看 | 人人看人人草 | 国产偷录叫床高潮录音 | 国产精久久久 | 青青草av | 羞羞视频一区二区 | 欧美一级免费黄色片 | 色伊人 | 91精品国产高清久久久久久久久 | 日韩成人免费在线视频 | 毛片入口 | 欧美不卡 | 中文二区 | 久久国内精品 | 岛国av免费看 | 亚洲黄色国产 | 91国在线高清视频 | 中文字幕av一区二区三区 | 特黄色毛片 | 日韩在线精品视频 | 久久久久亚洲精品 | 日韩欧美国产精品 | 免费九九视频 | 亚洲国产成人精品女人久久久 | 99视频免费在线观看 | 国产精品色婷婷久久58 | www国产成人免费观看视频,深夜成人网 | 国产精品a久久久久 | 国产一区电影 | 一级毛片视频在线 | 天天夜夜操 |