com.xxl.job.admin
- 啟動類的包,沒什么內(nèi)容
- 類
XxlJobAdminApplication
boot啟動項,沒什么內(nèi)容
com.xxl.job.admin.controller
- 頁面和接口的Controller
- 類
IndexController
登錄登出邏輯和一些首頁的基礎(chǔ)頁面
@InitBinder 可以學習下
JobApiController
用于提供給客戶端接入的Api接口,包含callback,registry,registryRemove
JobCodeController
GLUE用到的源碼的編輯頁面功能
需要注意只保留同一任務(wù)的30次修改記錄
JobGroupController
執(zhí)行器的增刪改查功能
JobInfoController
任務(wù)的增刪改查功能
只顯示自己賬號關(guān)聯(lián)的執(zhí)行器的任務(wù),用作權(quán)限管理
JobLogController
任務(wù)日志相關(guān)的簡單功能
有一個logkill的終止任務(wù)可以了解一下具體邏輯
UserController
用戶的增刪改查功能
com.xxl.job.admin.controller.annotation
- 自定義注解
- 類
CookieInterceptor
用于前端modelAndView里面放入cookie信息和國際化信息
PermissionInterceptor
權(quán)限攔截器,是否需要登錄和是否需要管理員操作
WebMvcConfig
注冊需要用到的攔截器
com.xxl.job.admin.controller.interceptor
- 攔截器
- 類
PermissionLimit
權(quán)限相關(guān)很簡單
com.xxl.job.admin.controller.resolver
- 異常處理
- 類
WebExceptionResolver
統(tǒng)一的最外層異常攔截,json的返回標準異常數(shù)據(jù),否則跳轉(zhuǎn)到報錯頁面
com.xxl.job.admin.core.alarm
- 告警處理
- 類
JobAlarm
告警接口,實現(xiàn)該接口的服務(wù)會在告警時調(diào)用
JobAlarmer
封裝的告警方法,把接口的所有實現(xiàn)全部調(diào)用一遍
com.xxl.job.admin.core.alarm.impl
- 告警實現(xiàn)
- 類
EmailJobAlarm
告警的郵件發(fā)送
com.xxl.job.admin.core.complete
- 任務(wù)完成后的操作
- 類
XxlJobCompleter
任務(wù)完成以后,更新日志信息,同時成功以后觸發(fā)子任務(wù)
com.xxl.job.admin.core.conf
- 配置信息
- 類
XxlJobAdminConfig
配置信息,沒什么功能
com.xxl.job.admin.core.cron
- CRON表達式的工具類
- 類
CronExpression
CRON表達式的工具類,看注釋是從quartz里面copy過來的
com.xxl.job.admin.core.exception
- 異常類
- 類
XxlJobException
自定義異常類,沒什么邏輯
com.xxl.job.admin.core.model
- 對應(yīng)的數(shù)據(jù)對象,都是POJO
- 類
XxlJobGroup
XxlJobInfo
XxlJobLog
XxlJobLogGlue
XxlJobLogReport
XxlJobRegistry
XxlJobUser
com.xxl.job.admin.core.old
- 廢棄代碼的存放位置,已經(jīng)廢棄了,所以具體類不再說明
com.xxl.job.admin.core.route
- 路由相關(guān)包
- 類
ExecutorRouter
路由選擇的接口
ExecutorRouteStrategyEnum
路由的字典和實現(xiàn)類映射關(guān)系
com.xxl.job.admin.core.route.strategy
- 路由選擇的實現(xiàn)方式(這里沒有分片廣播,分片廣播不用選路由)
- 類
ExecutorRouteBusyover
忙碌轉(zhuǎn)移路由實現(xiàn)
根據(jù)任務(wù)ID,去每一個地址獲取該任務(wù)是否在執(zhí)行中,如果執(zhí)行,則換另一個,如果都在執(zhí)行則會報錯,慎用
ExecutorRouteConsistentHash
一致性HASH路由實現(xiàn)
通過hash值去完成映射關(guān)系
有幾個注意事項
- 了解TreeMap
- 相同地址的不同順序hash不同
- 每個任務(wù)的hash是固定的(所以對于同一個任務(wù),有可能是盯著一臺機器的跑的)
ExecutorRouteFailover
故障轉(zhuǎn)移路由實現(xiàn)
多個地址,主動獲取服務(wù)器存活狀態(tài),找到第一個,默認接口都是存活的,也可以修改實現(xiàn)類,針對某些服務(wù)拒絕,不過沒啥必要
ExecutorRouteFirst
第一個路由實現(xiàn)
選地址列表的第一個
ExecutorRouteLast
最后一個路由實現(xiàn)
選地址列表的最后一個
ExecutorRouteLFU
最不經(jīng)常使用路由實現(xiàn)
單機內(nèi)存數(shù)據(jù)
有幾個注意事項
- 1天會清一次內(nèi)存數(shù)據(jù)
- 地址不存在了會清零,所以下線以后會歸零,起步是隨機數(shù)
ExecutorRouteLRU
最近最久未使用路由實現(xiàn)
單機內(nèi)存數(shù)據(jù)
有幾個注意事項
- 1天會清一次內(nèi)存數(shù)據(jù)
- 基于LinkedHashMap的key的迭代器
- 有部分注釋還沒特別理解,需要進一步研究下
ExecutorRouteRandom
隨機路由實現(xiàn)
地址列表里面隨機選一個
ExecutorRouteRound
輪詢路由實現(xiàn)
根據(jù)單機內(nèi)存同一個任務(wù)的執(zhí)行次數(shù),然后根據(jù)地址表輪詢
有幾個注意事項
- 一個地址順序調(diào)整
- 一個是單機內(nèi)存(集群會有偏差)
- 100萬次會有一次類似歸零操作
- 1天會清一次內(nèi)存數(shù)據(jù)
com.xxl.job.admin.core.scheduler
- 調(diào)度任務(wù)的主方法
- 類
MisfireStrategyEnum
時間延誤以后的處理方案(忽略,立即執(zhí)行一次) 2.3.0的新功能
ScheduleTypeEnum
調(diào)度的執(zhí)行方式(CRON,固定速度) 2.3.0的新功能
XxlJobScheduler
調(diào)度任務(wù)的主方法,除了國際化初始化以外,還把所有的com.xxl.job.admin.core.thread里面的線程池都啟動了
還有一個根據(jù)地址獲取執(zhí)行器實現(xiàn)類的方法
com.xxl.job.admin.core.thread
- 所有調(diào)度任務(wù)用到的線程
- 類
JobCompleteHelper
一組callback線程
- 調(diào)用XxlJobCompleter的callback行為(無論成功失敗)
一個守護線程- 超時的任務(wù)且執(zhí)行器已經(jīng)不再了,就標注失敗了
- 這里有個問題,超時了,但是執(zhí)行器在1分半內(nèi)重啟完成的怎么處理(TODO)
- 還有一個問題,疑似是bug,任務(wù)的超時時間的設(shè)定似乎沒有用到過(客戶端里面用到了,超時算失敗)
- 守護線程需要了解一下,只要所有線程全部執(zhí)行完畢以后,守護線程會被回收而不是等待線程執(zhí)行完畢以后回收
JobFailMonitorHelper
失敗的守護進程
- 查到失敗的數(shù)據(jù),需要重試的進行重試,該告警的進行告警
JobLogReportHelper
日志和報表的守護進程
- 生成當日的報告,同時把超期的日志進行刪除
- 刷3天的報告,今天,昨天,前天
JobRegistryHelper
注冊和remove線程用來更新registry里面的數(shù)據(jù)
守護進程,用刷新執(zhí)行器里面的地址信息
在注冊和remove的時候有想過要實時刷新執(zhí)行器信息,不過應(yīng)該是擔心更新太頻繁影響性能,所以最終沒有這么做
JobScheduleHelper
schedule線程:把需要執(zhí)行的任務(wù)檢索出來扔到ring數(shù)據(jù)中,因為schedule是5秒一次,時間不夠精確
ring線程:1秒一次,將該執(zhí)行的任務(wù)進行執(zhí)行
有幾個問題
- FastMax+SlowMax的算法值得商榷
- 基于數(shù)據(jù)庫的鎖,這里是xxl和quartz里面最大的問題,數(shù)據(jù)庫鎖量很難大,即便是集群也解決不掉
- scheduleJobQuery似乎應(yīng)該按照trigger_next_time的順序作為第一排列
- 超過5秒的任務(wù),不是立即執(zhí)行的就直接忽略了,進入下一次(2.2的時候因為沒有立即執(zhí)行選項,所以超過就直接忽略了)
- 超時但是5秒內(nèi)的,立即執(zhí)行,然后算下一次時間,如果還在5秒內(nèi),扔到ring隊列里面
- ring隊列是最終觸發(fā)任務(wù)的,因為1秒一次所以時間準確
JobTriggerPoolHelper
fastTriggerPool 和 slowTriggerPool 兩個池子,分別調(diào)用觸發(fā)邏輯XxlJobTrigger
快隊列和慢隊列的計算方式感覺不是很好
com.xxl.job.admin.core.trigger
- 觸發(fā)邏輯
- 類
TriggerTypeEnum
觸發(fā)原因的字典表
XxlJobTrigger
觸發(fā)的具體邏輯,這里有分片邏輯
其他就是記錄日志,請求參數(shù),然后發(fā)送請求
com.xxl.job.admin.core.util
- 工具包(都是一些基礎(chǔ)工具類,LocalCacheUtil可以參考下)
com.xxl.job.admin.dao
- DB的dao沒什么具體邏輯
com.xxl.job.admin.service
- 接口定義
- 類
LoginService
登錄邏輯,其中token有點問題
XxlJobService
接口定義
com.xxl.job.admin.service.impl
- 實現(xiàn)類
- 類
AdminBizImpl
對應(yīng)JobApiController的里面的東西,沒啥內(nèi)容
XxlJobServiceImpl
有一個5秒預讀的錯過