xxl-job(https://github.com/xuxueli/xxl-job) 系統的具體設計,可以參考官方文檔,非常詳細,這里只說一下大概的流程。
1. 應用端通過繼承類或者注解的方式,來標示一個類或者一個方法是一個job。
2. 在應用啟動的時候,會做3個事情:
1. 掃描上面第一步的類或者方法,放入內存。
2. 啟動一個內嵌的基於netty的http服務端。
3. 將內嵌的服務端地址注冊到調度中心。
3. 調度中心取獲分布式鎖(mysql 的for update,保證HA狀態下的調度中心只有一個能執行),拿到鎖之后掃描需要執行的job,計算下一次要執行的時間, 放入到一個ring,類似於一個時間輪,之后會有一個單獨的線程從ring中拿到當前要執行的job進行觸發執行,觸發方式是通過一定的負載策略,調用上面第二步內嵌http服務器的地址。
4. 應用內的http服務端接收到請求,會放入到內存隊列中,之后會有單獨一個線程從隊列中拿到要執行的job進行執行。
我的注解版xxl-job:
https://github.com/zhaoyb/xxl-job