背景
微服務項目中,Spring 的 @Scheduled 注解在有多個實例的情況下是無法使用的,因為會有定時任務重復執行的問題。
引入 xxl job 等定時任務框架又非常的重,需要耗費一定的時間才能夠搭建使用,如果項目對定時任務的需求比較簡單,完全劃不來。
@Scheduled 非常的方便,所以我們可以對 @Scheduled 進行了增強,使其支持分布式的定時任務。
原理
Spring 的 @Scheduled 使用 cron 的情況下,是按照周期執行的,也就是根據表達式計算的下次執行的時間是固定的。
所以我們可以計算出下次執行的時間,然后依據這個時間對當前周期進行加鎖,防止定時任務的重復執行。
這樣,在一個周期內只有一個定時任務會被執行,同時相比直接加鎖,也不會出現執行任務時間過長,以至于影響到下個周期的定時任務執行的情況。
使用
先決條件:配置 redis 。
使用方法:引入注解 @EnableDistributedScheduling 即可生效。
@EnableDistributedScheduling@SpringBootApplicationpublic class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }}
已提交至 Maven 中央倉庫,可直接引入依賴:
<dependency> <groupId>com.gaoice</groupId> <artifactId>distributed-scheduling-spring-boot-starter</artifactId> <version>1.1</version></dependency>
如果微服務項目對定時任務的需求比較簡單,并且對定時任務的可配置性沒有太高要求,完全可以使用增強的 @Scheduled 注解方便快捷地實現分布式的定時任務。
項目地址: https://github.com/gaoice/distributed-scheduling-spring-boot-starter
歡迎 star 。
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。