參考文章:
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配置:
@beanpublic
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
執行定時任務。
publicclass
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 星期...