XXL-JOB研究 一 执行器启动流程

执行器启动,初始化路口在XxlJobSpringExecutor类的afterSingletonsInstantiated方法中,源码如下

    @Override
    public void afterSingletonsInstantiated() {
     
        // 从Spring上下文中获取所有类,遍历类,获取所有添加了XxlJob注解的方法
        // 然后调用registJobHandler将这些方法注册到缓存中
        initJobHandlerMethodRepository(applicationContext);

        // Glue相关的东西
        GlueFactory.refreshInstance(1);

        try {
     
        	//调用父类jobHandlerRepository的start方法
            super.start();
        } catch (Exception e) {
     
            throw new RuntimeException(e);
        }
    }

    public void start() throws Exception {
     

        // 初始化日志路径和glue的日志路径
        XxlJobFileAppender.initLogPath(logPath);

        // 将调度中心的ip、端口、accessToken封装成AdminBizClient对象
        // 有几个ip,就封装几个AdminBizClient对象,然后把这些对象都放到adminBizList中
        initAdminBizList(adminAddresses, accessToken);
        
        // 初始化日志线程,遍历日志根目录下的日期文件夹,如果文件夹日期超过30天,就删除
        // 遍历完后TimeUnit.DAYS.sleep(1)休息一天,即每天检查一次
        JobLogFileCleanThread.getInstance().start(logRetentionDays);

        // 初始化回调线程,从队列callBackQueue中获取回调对象HandleCallbackParam
        // 注意:callBackQueue是LinkedBlockingQueue,获取对象的方法是take,所以没有对象时会一直阻塞
        // 当获取到回调对象后,调用doCallback方法,具体源码下面分析
        TriggerCallbackThread.getInstance().start();

        // 获取当前的ip和配置的执行器注册端口,然后以此端口创建TCP服务端
        // 创建完服务端后,往所有调度中心发送注册服务的http请求(注册接口是api/registry)
        // 参数内容包括:执行器名称、当前TCP服务端的ip和端口
        // 当系统关闭时,还会往所有调度中心发送移除注册的http请求(移除接口是api/registryRemove)
        // 参数内容同上
        initEmbedServer(address, ip, port, appname, accessToken);
    }
 

doCallback源码如下

    private void doCallback(List<HandleCallbackParam> callbackParamList){
     
        boolean callbackRet = false;
        // 遍历之前创建的AdminBiz对象集合,也就是调度中心地址
        for (AdminBiz adminBiz: XxlJobExecutor.getAdminBizList()) {
     
            try {
     
            	// 通过http请求,发送回调命令,并获取返回值
                ReturnT<String> callbackResult = adminBiz.callback(callbackParamList);
                if (callbackResult!=null && ReturnT.SUCCESS_CODE == callbackResult.getCode()) {
     
                	// 回调成功就标记一下
                    callbackLog(callbackParamList, "
----------- xxl-job job callback finish."
); callbackRet = true; break; } else { callbackLog(callbackParamList, "
----------- xxl-job job callback fail, callbackResult:"
+ callbackResult); } } catch (Exception e) { callbackLog(callbackParamList, "
----------- xxl-job job callback error, errorMsg:"
+ e.getMessage()); } } if (!callbackRet) { // 回调失败就记录日志 appendFailCallbackFile(callbackParamList); } }

调度中心在接收到registry请求时,会先更新xxl_job_registry表中的记录,如果更新条数为0,就insert记录。registryRemove则是从xxl_job_registry表中删除记录

你可能感兴趣的:(xxl-job,java)