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

從零搭建開發腳手架 基于Spring Task實現動態管理任務

開發 后端
Timer 是 Jdk自帶的定時任務執行類,無論任何項目都可以直接使用 Timer 來實現定時任務,所以 Timer 的優點就是使用方便。

[[396614]]

本文轉載自微信公眾號「Java大廠面試官」,作者laker。轉載本文請聯系Java大廠面試官公眾號。

什么是定時任務

定時任務是指調度程序在指定的時間或周期觸發執行的任務,常用場景如下:

  • 定時發短信
  • 定時變更數據
  • 定時統計數據
  • 定時修改狀態
  • 定時開始活動等

常見幾種JAVA實現方式

Timer

簡介:Timer 是 Jdk自帶的定時任務執行類,無論任何項目都可以直接使用 Timer 來實現定時任務,所以 Timer 的優點就是使用方便。

原理:

  • 調度器:單線程。
  • 任務存儲:最小堆實現任務存儲。

優點:Jdk自帶類,無需引入其他Jar,簡單易用。

缺點:Timer中的多個任務只能使用一個線程去執行,因此任務之間的執行情況會相互影響。

  • 當一個任務的執行時間過長時,會影響其他任務的調度任務異常影響其他任務。
  • 當一個任務拋出異常,其他任務也會終止運行.

結論:基本無人使用。

ScheduledExecutorService

簡介:ScheduledExecutorService 是JDK里面自定義的幾種線程池中的一種,支持多線程并發的去執行多個調度任務,彌補了Timer的缺陷。

原理:

  • 調度器:多線程。
  • 任務存儲:最小堆實現任務存儲。

優點:Timer能做到的事情ScheduledExecutorService都能做到,且完美的解決上面所說的Timer存在的兩個問題。

缺點:只支持固定速率(fixed-rate)或固定延遲(fixed-delay)的調度任務,不靈活。

結論:常用于框架內部定時任務。

Spring Task

描述:Spring Framework 自帶的定時任務。

優點:同ScheduledExecutorService,同時增加了支持cron表達式,可以配置任意基于時鐘的調度任務。

缺點:

  • 不支持動態修改任務狀態、暫停/恢復任務,以及終止運行中任務。
  • 不支持在線監控執行的任務。

原理:ScheduledExecutorService的擴展。

結論:常用于中小型企業,作為單機定時任務使用。

以上都是單機版本。

其他分布式定時任務諸如:quartz、xxl-job、elastic-job等等,功能、性能都很強勁,這里不作為研究對象,詳情參考:

  • Java定時任務框架對比
  • 定時任務實現原理 最小堆 時間輪

上面的這些框架都不是我想選擇的,要想自由的掌控雷電,那就自己造個簡易輪子,滿足90%需求即可。

期望實現如下特性:

  • 輕量、輕量、輕量。
  • 支持在線監控執行的任務。
  • 支持動態修改任務狀態、暫停/恢復任務,以及終止運行中任務。
  • 支持在線配置調度任務入參和。
  • 支持集群環境擴展(可選)。

收集了半天信息,直接使用Spring Task就可以實現,僅依賴Spring Boot。

Spring Task詳解

初級靜態配置任務

代碼示例:

  1. @Component  
  2. @EnableScheduling // 開啟定時任務 
  3. public class DemoApplication { 
  4.  // 添加定時任務 
  5.     @Scheduled(cron = "0/5 * * * * *") // cron 表達式,每5秒執行 
  6.     public void doTask(){ 
  7.         System.out.println("我是定時任務~"); 
  8.     } 

無法動態修改任務狀態、暫停/恢復任務,以及終止運行中任務。

進階動態配置任務

實現設計

關鍵技術點和坑

  • Spring Task的調度器默認是線程數為1的ThreadPoolTaskScheduler,自動裝配類為TaskSchedulingAutoConfiguration,多任務之間的執行會相互影響,一定要修改默認值。
  • 通過TaskScheduler接口,可以擴展實現動態修改任務狀態、暫停/恢復任務,以及終止運行中任務。
    • TaskScheuler是在Spring 3.0中引入的,有多種方法可以在將來的某個時刻運行,它還返回ScheduledFuture接口的對象,可用于取消計劃的任務或檢查任務是否完成。
  • cron-utils一個Java庫,用于解析,驗證Cron表達式,可以去GitHub查看詳細說明。

實現設計

定義IJob接口,用于客戶端描述任務

  1. public interface IJob { 
  2.     void execute(JobContext map) throws JobException; 

定義注解,用于配合IJob接口定義任務

  1. @Target({ElementType.TYPE}) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. @Documented 
  4. @Component 
  5. public @interface Job { 
  6.  
  7.     @AliasFor(annotation = Component.class) 
  8.     String value() default ""
  9.  
  10.     /** 
  11.      * cron 表達式默認不"-"代表不執行 
  12.      */ 
  13.     String cron() default "-"
  14.  
  15.     /** 
  16.      * 任務編碼 必須唯一 
  17.      */ 
  18.     String taskCode(); 
  19.  
  20.     /** 
  21.      * 任務名稱 
  22.      */ 
  23.     String taskName(); 
  24.  

定義運行任務狀態

  1. public class Task{ 
  2.     /** 
  3.      * 任務的編碼 必須全局唯一 
  4.      */ 
  5.     private String taskCode; 
  6.     /** 
  7.      * 任務的名稱 
  8.      */ 
  9.     private String taskName; 
  10.     /** 
  11.      * 任務的類名稱 
  12.      */ 
  13.     private String taskClassName; 
  14.     /** 
  15.      * 任務的cron表達式 
  16.      */ 
  17.     private String taskCron; 
  18.  
  19.     @JsonIgnore 
  20.     private ScheduledFuture scheduledFuture; 
  21.  
  22.     @JsonIgnore 
  23.     private IJob job; 
  24.  
  25.     private TaskStateEnum taskState; 

定義任務存儲接口,用于存儲在緩存或者DB中

  1. public interface ITaskStore { 
  2.  
  3.     void saveTask(Task task); 
  4.  
  5.     List<Task> list(); 
  6.  
  7.     Task updateTaskByTaskCode(String taskCron, String taskName, String taskCode); 
  8.  
  9.     Task updateTaskStateByTaskCode(TaskStateEnum taskState, String taskCode); 
  10.  
  11.     void deleteTaskByTaskCode(String taskCode); 
  12.  
  13.     Task findByTaskCode(String taskCode); 
  14.  

定義任務鎖接口,解決并發問題,以及擴展支持集群環境

  1. public interface ILockService { 
  2.     void lock(String taskCode); 
  3.     void unlock(String taskCode); 
  4. }     

定義事件監聽器,用于監聽任務的狀態事件,可擴展狀態監控,各種回調等

  1. public interface IEventListener { 
  2.     void listener(Event event); 

核心處理器,處理核心流程

  • 初始化加載所有IJob的實現 從Spring容器獲取IJob實現類并解析Job注解
  • 添加任務threadPoolTaskScheduler.schedule(task,cron)
  • 更新任務詳情
    • scheduledFuture.cancel(true)
    • threadPoolTaskScheduler.schedule(task,cron)
  • 啟動任務 threadPoolTaskScheduler.schedule(task,cron)
  • 暫停任務 scheduledFuture.cancel(true)
  • 任務監控 TaskList

待實現功能

  • 重試補償:失敗重試。
  • failstore : 存儲失敗任務,供人肉補償。
  • misfire:存儲錯過的任務,供人肉補償。

自己在核心處理器中加下相應的增強功能邏輯即可。

使用示例

直接實現IJob接口并加上Job注解即可

  1. @Job(taskCode = "job1", taskName = "laker測試任務",cron = "0/5 * * * * *"
  2. @Slf4j 
  3. public class TestJob implements IJob { 
  4.     @Override 
  5.     public void execute(Map map) throws Exception { 
  6.         log.info("laker job run"); 
  7.         TimeUnit.SECONDS.sleep(10); 
  8.     } 

全部代碼:https://gitee.com/lakernote/lakernote

參考:https://juejin.cn/post/6844904002606350343

SpringBoot官網

 

責任編輯:武曉燕 來源: Java大廠面試官
相關推薦

2021-09-01 10:07:43

開發零搭建Groovy

2021-03-09 17:11:09

數據庫腳手架開發

2020-08-19 08:55:47

Redis緩存數據庫

2021-07-13 18:42:38

Spring Boot腳手架開發

2021-05-13 17:02:38

MDC腳手架日志

2021-04-13 14:47:53

認證授權Java

2021-07-29 18:49:49

Spring開發腳手架

2021-04-20 19:24:16

腳手架 Java微信

2021-03-11 14:16:47

Spring Boo開發腳手架

2021-06-02 17:58:49

腳手架 冪等性前端

2021-02-19 22:43:50

開發腳手架Controller

2016-08-10 14:59:41

前端Javascript工具

2025-05-16 07:24:41

Springkafka腳手架

2023-11-21 17:36:04

OpenFeignSentinel

2014-08-15 09:36:06

2021-01-07 05:34:07

腳手架JDK緩存

2020-06-29 11:35:02

Spring BootJava腳手架

2021-08-30 06:59:06

StrviewAppStrview.js項目

2022-07-11 10:38:06

TienChin項目動態

2018-06-11 14:39:57

前端腳手架工具node.js
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国内久久 | 日韩一区在线播放 | 欧美一区二区在线播放 | 色播久久久 | 成人在线观看网址 | 99久久99| 日日碰狠狠躁久久躁婷婷 | 久久免费小视频 | 一区二区三区欧美 | 精品欧美乱码久久久久久 | 18成人在线观看 | 视频一二三区 | 亚洲天堂中文字幕 | 日韩欧美视频网站 | 免费看黄视频网站 | 九色www| 成在线人视频免费视频 | 精品国产乱码久久久久久丨区2区 | 正在播放国产精品 | 中文精品视频 | 91人人视频在线观看 | 久久精品国产亚洲夜色av网站 | 亚洲国产精品一区二区三区 | 午夜影院在线观看视频 | 精品久久久久久久久久久久久 | 久久精品播放 | 日韩精品一区二区三区中文在线 | 日韩精品一区二区三区在线观看 | 久草在线免费资源 | 日韩欧美在线一区 | 97精品国产| 日韩免费视频 | 超碰伊人久久 | 亚洲性视频 | 午夜一级黄色片 | 国产精品美女久久久久久免费 | 亚洲va在线va天堂va狼色在线 | 91高清免费观看 | 日韩欧美大片在线观看 | 欧美日韩一区二区在线观看 | 亚洲国产一区视频 |