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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

scheduled只执行一次_升级@Scheduled-分布式定时任务

發布時間:2023/12/19 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 scheduled只执行一次_升级@Scheduled-分布式定时任务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近我在對項目的定時任務服務升級,希望改造成分布式,原本是利用@Scheduled注解實現,然而它并不支持分布式,如果改成quartz或者Spring Cloud Task,感覺對于自己這個簡單的項目也沒有必要。因此,我準備手寫一個簡單的支持分布式定時調度任務的框架。

項目地址是https://github.com/death00/dis-schedule,歡迎大家star、提意見。

分析

先分析了一下自己的項目,全都是用的cron表達式,因此執行時間點都是固定的,如果升級為分布式的話,肯定是希望在同一個時間點只有一個應用去執行定時調度。

場景就變成了:

多個應用在同一個時間都嘗試去執行任務,但最終只有一個應用真正執行。

這樣的話,立馬就會讓人聯想到使用鎖去解決,因為是多個應用,所以就是分布式鎖。那么,場景又變了:

多個應用在同一個時間都嘗試去獲取分布式鎖,只有一個應用能搶到這把鎖,搶到鎖的應用可以執行定時任務,其他應用則直接放棄,等待下一次執行時間。

搶鎖的時機是每次定時任務執行之前,這又讓我聯想到了AOP,那么利用注解也就順理成章了。

分布式鎖

既然談到了分布式鎖,那么就想一下,這把鎖的名稱構成是什么。因為定時任務都有自己專門的時間,如果僅僅采用時間的話,那么當有兩個任務同時執行時,則就是在搶一把鎖,這同樣是不合理的。

所以,鎖的名稱由兩部分組成:任務執行時間、任務名稱。

實現

實現方案其實已經很成熟了,可以利用Redis、數據庫、Zookeeper等,Redis用的命令是setNx,數據庫一般都是利用的唯一索引,Zookeeper這點我也不是很了解(如果有感興趣的同學,歡迎在我的項目中添加)。

我的項目中實現了Redis、數據庫兩種方式,可以看類DisScheduleRedisServiceImpl、DisScheduleMongodbServiceImpl。

注解

其次,我自定義了一個注解DisSchedule,

@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface DisSchedule {/*** 定時調度任務的名稱(默認是方法名)*/String name() default "";/*** 任務的間隔時間*/int duration();/*** duration的時間單位(默認:分鐘)*/DisScheduleUnit unit() default DisScheduleUnit.MINUTES; }
  • name代表此次定時調度任務的名稱。
  • duration代表任務的間隔時間,配合unit。
  • unit是自定義的時間單位,有秒、分鐘。
  • 該注解需要配合@Scheduled共同使用,例如:

    @DisSchedule(name = "testSchedule", duration = 1, unit = DisScheduleUnit.MINUTES)@Scheduled(cron = "0 0/1 * * * ?")

    該cron表達式代表1分鐘執行一次,且是在整數分鐘開始的時候執行,因此@DisSchedule也需要設置為1分鐘的時間。

    切面

    接下來,我們只需要在Aspect中定義好切入點(有注解@DisSchedule的方法上),針對這些方法,需要使用Around(環繞增強)進行攔截,因為當搶不到鎖的時候,就不允許執行。

    具體可以參考類DisScheduleAspect。

    總結

    以上就是我實現的簡單的分布式定時任務,雖然簡單,但應該可以滿足你的基礎需求,接下來,我會在這個之上,逐步增加功能(比如監測、失敗后預警等)。如果你有什么想法,歡迎在下方留言。

    有興趣的話可以訪問我的博客或者關注我的公眾號、頭條號,說不定會有意外的驚喜。

    https://death00.github.io/

    總結

    以上是生活随笔為你收集整理的scheduled只执行一次_升级@Scheduled-分布式定时任务的全部內容,希望文章能夠幫你解決所遇到的問題。

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