xxl-job客戶端啟動分析
阿新 • • 發佈:2022-03-31
1.xxl客戶端的核心配置檔案
@Configuration public class XxlJobConfig { private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); @Value("${xxl.job.admin.addresses}") private String adminAddresses; @Value("${xxl.job.accessToken}") private String accessToken; @Value("${xxl.job.executor.appname}") private String appname; @Value("${xxl.job.executor.address}") private String address; @Value("${xxl.job.executor.ip}") private String ip; @Value("${xxl.job.executor.port}") private int port; @Value("${xxl.job.executor.logpath}") private String logPath; @Value("${xxl.job.executor.logretentiondays}") private int logRetentionDays; @Bean public XxlJobSpringExecutor xxlJobExecutor() { logger.info(">>>>>>>>>>> xxl-job config init."); XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(adminAddresses); xxlJobSpringExecutor.setAppname(appname); xxlJobSpringExecutor.setAddress(address); xxlJobSpringExecutor.setIp(ip); xxlJobSpringExecutor.setPort(port); xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); return xxlJobSpringExecutor; } /** * 針對多網絡卡、容器內部署等情況,可藉助 "spring-cloud-commons" 提供的 "InetUtils" 元件靈活定製註冊IP; * * 1、引入依賴: * <dependency> * <groupId>org.springframework.cloud</groupId> * <artifactId>spring-cloud-commons</artifactId> * <version>${version}</version> * </dependency> * * 2、配置檔案,或者容器啟動變數 * spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.' * * 3、獲取IP * String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress(); */ }
2.可以看到裡面的xxlJobExecutor方法返回了一個為XxlJobSpringExecutor型別的Bean物件
3.我們來看一下XxlJobSpringExecutor型別
4.我們看下afterSingletonsInstantiated方法裡都做了什麼
4.1 initJobHandlerMethodRepository
初始化jobHandler的方法到Respository(儲存中心)中,傳遞引數spring的context物件
我們先看一下new MethodJobHandler這個類
我們再回到上面的這句
點選registJobHandler方法,看內部做了什麼
4.2 GlueFactory.refreshInstance
GlueFactory 重新整理例項,glue玩法是把要跑的任務程式碼維護到了xxl-job的資料庫中,平時使用場景不多
4.3 super.start()
呼叫父類XxlJobExecutor的start方法
4.3.1 XxlJobFileAppender.initLogPath(logPath);
初始化日誌路徑
4.3.2 initAdminBizList(adminAddresses, accessToken);
初始化連線到admin的客戶端,客戶端可以連線多個admin地址
我們看下AdminBizClient物件的定義
是不是很清晰了,到admin客戶端的連線裡有callback,registry,registryRemove三個方法,分別傳送http的post請求,來與伺服器端進行資料互動,完成回撥,註冊,移除註冊的功能邏輯
4.3.3 JobLogFileCleanThread.getInstance().start(logRetentionDays);
新起了一個名為xxl-job, executor JobLogFileCleanThread的執行緒,用於按照配置的日誌保留條件進行間歇的檢測,每個1天檢查一次
4.3.4 TriggerCallbackThread.getInstance().start();
觸發器回撥執行緒
我們點doCallback進去看看裡面的邏輯
4.3.5 initEmbedServer(address, ip, port, appname, accessToken);
初始化客戶端本地rpc服務
我們看下EmbedServer的設計
我們看下startRegistry方法
發現是起了一個註冊執行緒,每隔30秒與admin服務端互動,傳送註冊請求,不斷重新整理自己的狀態
當stop標誌位變為stop的時候,退出while迴圈,進行取消註冊的邏輯