Kafka成長記9:Kafka記憶體緩衝區中的訊息最終如何傳送出去的?
一、定時任務
1、cron表示式
語法:秒 分 時 日 月 周 年(Spring 不支援)
cron表示式是由6或7個由空格分隔的欄位組成的字串。欄位可以包含任何允許的值,以及該欄位允許的特殊字元的各種組合。欄位如下所示
Cron Trigger Tutorial (quartz-scheduler.org)
2、特殊字元含義
*表示所有值:用於選擇欄位中的所有值。例如,分鐘欄位中的表示每分鐘
?表示沒有特定的值: 當你需要在允許字元的兩個欄位中指定某一個欄位,而不是另一個欄位時很有用。例如,如果我想讓觸發器在一個月的某一天(比如10日)觸發,但不關心那是一週中的哪一天,那麼我將在month -of- day欄位中輸入10
- 用於指定範圍:例如,小時欄位中的10-12表示小時10、11和12。
, 用於指定附加值:例如,MON,WED,FRI在星期欄位中表示星期一、星期三和星期五。
/ 用於指定增量:例如,seconds欄位中的“0/15”表示“秒0、15、30和45”。秒欄位中的“5/15”表示“秒5、20、35和50”。你也可以在“字元”後面指定“/”——在這種情況下,相當於在“/”之前有“0”。“1/3”在month -of- day欄位中的意思是“從每月的第一天開始,每3天開始一次”。
L (" last ") 在允許的兩個欄位中都有不同的含義:例如,day-of-month欄位中的值“L”表示“這個月的最後一天”——在非閏年中,1月的31天表示1月,2月的28天表示2月。如果在工作日欄位中單獨使用,則表示“7”或“SAT”。但是,如果在週中的一天欄位中使用另一個值,則表示“這個月的最後xxx天”——例如,“6L”表示“這個月的最後一個星期五”。您還可以指定從一個月的最後一天開始的偏移量,例如“L-3”,這意味著日曆月的第三天到最後一天。
W (weekday) 用於指定離給定日期最近的工作日(週一至週五):例如,如果要指定15W作為month -of- day欄位的值,則其含義是:一個月中離15號最近的工作日。所以如果15號是週六,觸發器就會在14號週五發射。如果15日是週日,觸發器將在16日星期一觸發。如果15號是星期二,那麼它就會在15號星期二發射。但是,如果您指定1W作為每月的日值,並且第1個是星期六,觸發器將在第3個星期一觸發,因為它不會跳過邊界
“L”和“W”字元也可以在month -of- day欄位中組合成“LW”,即“這個月的最後一個工作日”
# 用於指定一個月的第n XXX天:例如,工作日欄位中6#3的值表示這個月的第三個星期五(第6天=星期五,#3 =這個月的第三個星期五)。其他例子:2#1 =每月的第一個星期一,4#5 =每月的第五個星期三。請注意,如果您指定了#5,並且當月的每週沒有5天,那麼當月就不會生效。
合法字元以及月份和星期的名稱不區分大小寫。MON和mon是一個意思。
3、Cron示例
4、Springboot整合定時任務
利用Spring自帶的定時任務
@Slf4j
@Component
@EnableScheduling
public class HelloScheduled {
@Scheduled(cron = "* * * * * ?")
public void hello() {
log.info("hello.....");
}
}
Spring中cron只有6位,並且1-7代表週一到周七
二、非同步定時任務
定時任務預設是阻塞的,但是不應該阻塞,解決辦法
-
可以讓業務執行以非同步的方式,自己提交到執行緒池
CompletableFuture.runAsync(()->{ xxxservice.hello(); },executor);
-
支援定時任務的執行緒池
spring.task.execution.pool.core-size=5
spring.task.execution.pool.max-size=50
- 讓定時任務非同步執行
@EnableAsync
@Async
使用非同步+定時任務完成定時任務不阻塞的功能