專案中最近使用了多個定時任務處理業務需求,於是在實現業務邏輯過程中,產生了上圖一些思考和疑問,現在利用空餘時間進行一次覆盤。
@component
public
class
scheduledtask
@scheduled
(cron =
"0/1 * * * * ?"
)public
void
scheduledtask2()
}
相同定時任務先解決多工定時相同時間,是否存在優先順序執行順序,執行上面的**,列印日誌如下圖:
從控制台日誌發現,兩個定時任務並沒有存在一定的執行順序,存在亂序現象。
故:序列定時任務,沒有明顯的優先順序關係。
乙個定時任務阻塞
為了實現此場景的條件,將定時任務1中新增死迴圈邏輯。原始碼改動如下:
從控制台可以得出:多個定時任務時序列執行的,如果乙個任務出現阻塞,其他的任務都會受到影響。如果要實現並行執行,啟動類需要在上面的基礎上新增註解@enableasync
。任務方法上新增@async
註解。
原始碼如下:
@component
public
class
scheduledtask
@scheduled
(cron =
"0/1 * * * * ?"
)@async
public
void
scheduledtask2()
}
執行結果如下圖:
從控制台中列印的執行緒名發現:每次執行任務時,都是建立新的執行緒執行,使用預設執行緒池******asynctaskexecutor。
預設情況下非同步呼叫使用的執行緒池是******asynctaskexecutor,該執行緒池是不被推薦,因為該執行緒池的執行緒不重用,每次呼叫都會建立乙個新的執行緒。所以需要我們自定義執行緒池。
自定義區域性執行緒池
區域性執行緒池實際上就是指非同步方法上需要指定使用該執行緒池,否則將使用預設執行緒池。
配置非同步執行緒池原始碼如下:
@component
public
class
asynctaskexecutorconfig
}
定時任務原始碼修改如下:
@component
public
class
scheduledtask
@scheduled
(cron =
"0/1 * * * * ?"
)@async
//未指定執行緒池,則使用預設執行緒池
public
void
scheduledtask2()
}
控制台執行結果如下:
從圖中依據執行緒名字,看到任務1均有自定義執行緒池defineasynctask-*執行,同時驗證預設執行緒池******asynctaskexecutor
一直建立新執行緒執行。
定義全域性執行緒池
上面需在@async()註解中指定使用自定義執行緒池才有效,如果我們即不想指定執行緒池,又不想使用預設執行緒池池—全域性執行緒池。
定義全域性執行緒池可以通過實現asyncconfigurer
或者繼承asyncconfigurersupport
。
原始碼如下:
@configuration
public
class
asyncglobalconfig
extends
asyncconfigurersupport
}
再次執行上面的任務,結果如下:
任務1,指定自定義執行緒池,則有該執行緒池執行任務,其餘未指定執行緒池,則使用自定義的全域性執行緒池執行任務。
使用過執行緒池執行任務的夥伴應該會知道,執行緒提交任務分為execute()方式和submit()方式。
故在上面配置全域性執行緒池的基礎上,處理異常。從原始碼中可以得出asyncconfigurersupport
提供了兩個方法,其中getasyncexecutor()
是定義執行緒池的,getasyncuncaughtexceptionhandler()
是用於處理異常的。
處理異常原始碼實現如下:
static
class
customasyncexceptionhandler
implements
asyncuncaughtexceptionhandler
}
@override
public asyncuncaughtexceptionhandler getasyncuncaughtexceptionhandler()
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 星期...