xxl-job 2.3.0-SNAPSHOT的目錄結(jié)構(gòu)(Admin)

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)系
有幾個注意事項

  1. 了解TreeMap
  2. 相同地址的不同順序hash不同
  3. 每個任務(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. 1天會清一次內(nèi)存數(shù)據(jù)
  2. 地址不存在了會清零,所以下線以后會歸零,起步是隨機數(shù)

ExecutorRouteLRU
最近最久未使用路由實現(xiàn)
單機內(nèi)存數(shù)據(jù)
有幾個注意事項

  1. 1天會清一次內(nèi)存數(shù)據(jù)
  2. 基于LinkedHashMap的key的迭代器
  3. 有部分注釋還沒特別理解,需要進一步研究下

ExecutorRouteRandom
隨機路由實現(xiàn)
地址列表里面隨機選一個

ExecutorRouteRound
輪詢路由實現(xiàn)
根據(jù)單機內(nèi)存同一個任務(wù)的執(zhí)行次數(shù),然后根據(jù)地址表輪詢
有幾個注意事項

  1. 一個地址順序調(diào)整
  2. 一個是單機內(nèi)存(集群會有偏差)
  3. 100萬次會有一次類似歸零操作
  4. 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線程

  1. 調(diào)用XxlJobCompleter的callback行為(無論成功失敗)
    一個守護線程
  2. 超時的任務(wù)且執(zhí)行器已經(jīng)不再了,就標注失敗了
  3. 這里有個問題,超時了,但是執(zhí)行器在1分半內(nèi)重啟完成的怎么處理(TODO)
  4. 還有一個問題,疑似是bug,任務(wù)的超時時間的設(shè)定似乎沒有用到過(客戶端里面用到了,超時算失敗)
  5. 守護線程需要了解一下,只要所有線程全部執(zhí)行完畢以后,守護線程會被回收而不是等待線程執(zhí)行完畢以后回收

JobFailMonitorHelper
失敗的守護進程

  1. 查到失敗的數(shù)據(jù),需要重試的進行重試,該告警的進行告警

JobLogReportHelper
日志和報表的守護進程

  1. 生成當日的報告,同時把超期的日志進行刪除
  2. 刷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í)行
有幾個問題

  1. FastMax+SlowMax的算法值得商榷
  2. 基于數(shù)據(jù)庫的鎖,這里是xxl和quartz里面最大的問題,數(shù)據(jù)庫鎖量很難大,即便是集群也解決不掉
  3. scheduleJobQuery似乎應(yīng)該按照trigger_next_time的順序作為第一排列
  4. 超過5秒的任務(wù),不是立即執(zhí)行的就直接忽略了,進入下一次(2.2的時候因為沒有立即執(zhí)行選項,所以超過就直接忽略了)
  5. 超時但是5秒內(nèi)的,立即執(zhí)行,然后算下一次時間,如果還在5秒內(nèi),扔到ring隊列里面
  6. 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秒預讀的錯過

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容