spring定時任務原理

2022-09-06 10:09:20 字數 2223 閱讀 3929

參考文章: 

1、開發中使用時要注意的點

(0)spring定時任務執行原理實際使用的是jdk自帶的scheduledexecutorservice

(1)spring預設使用單執行緒的執行緒池去執行定時任務,所以如果某個任務執行時間過長,會導致其他定時任務阻塞無法執行。

(2)可以開啟並行排程,springboot中的使用方式:這種模式每次任務執行都會建立乙個執行緒去執行。

@enableasync

@enablescheduling

public

class

public

static

void

main(string args)

@scheduled(cron = "0/1 * * * * ?")

@async

public

void

sc1()

}

風險:如果某個定時任務出現死迴圈或者執行時間過長而出發時間較短,會導致執行緒數量不可控。

(3)最穩妥的處理方式:自定義任務執行的執行緒池,如下:

普通spring配置:

@bean

public

asynctaskexecutor asynctaskexecutor()

或@bean

public

scheduleexecutorservice scheduleexecutorservice

springboot中配置:

spring.task.scheduling.pool.size=10spring.task.scheduling.thread-name-prefix=task-schedule-

2、原始碼分析

通過監聽ioc容器初始化事件,掃瞄所有bean中帶有@scheduled註解的方法,然後封裝成task子類放置到scheduledtaskregistrar中。如果自己定義了scheduledexecutorservice,會使用自己定義的執行緒池,否則scheduledtaskregistrar#afterpropertiesset建立乙個單執行緒的定時任務執行器scheduledexecutorservice,注入到concurrenttaskscheduler中,然後通過taskscheduler執行定時任務。

public

class

scheduledannotationbeanpostprocessor

implements

scheduledtaskholder, mergedbeandefinitionpostprocessor, destructionawarebeanpostprocessor,

, disposablebean

}private

void

finishregistration()

.......................

if (this.registrar.hastasks() && this.registrar.getscheduler() == null

)

catch

(nouniquebeandefinitionexception ex)

catch

(nosuchbeandefinitionexception ex2) }}

catch

(nosuchbeandefinitionexception ex)

catch

(nouniquebeandefinitionexception ex2)

catch

(nosuchbeandefinitionexception ex3) }}

catch

(nosuchbeandefinitionexception ex2) }}

this

.registrar.afterpropertiesset();

}}

if (this.taskscheduler == null

)

Spring定時任務

sayhello 0 08 21 下面的表示式 0 15 10 6l 2002 2005 將在2002年到2005年的每個月的最後乙個星期五上午10點15分執行作業。你不可能用 trigger來做這些事情。你可以用兩者之中的任何乙個,但哪個跟合適則取決於你的排程需要。更多詳細介紹參考此處 關於cro...

spring 定時任務

xmlns 多加下面的內容 xmlns task 然後xsi schemalocation多加下面的內容 spring task 3.1.xsd最後是我們的task任務掃瞄註解 或者 public inte ce imytestservice component import org.springf...

Spring 定時任務

scheduled cron 0 0 1 override public synchronized void dojob throws exception 字段 允許值 允許的特殊字元 秒 0 59 分 0 59 小時 0 23 日期 1 31 l w c 月份 1 12 或者 jan dec 星期...