1. 程式人生 > 其它 >xxl-job客戶端啟動分析

xxl-job客戶端啟動分析

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迴圈,進行取消註冊的邏輯