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

本文详细解析了XXL-Job执行器的启动流程,包括初始化路口、注册方法、日志路径设置、调度中心注册、回调线程及TCP服务端创建等关键步骤。

执行器启动,初始化路口在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, "<br>----------- xxl-job job callback finish.");
                    callbackRet = true;
                    break;
                } else {
                    callbackLog(callbackParamList, "<br>----------- xxl-job job callback fail, callbackResult:" + callbackResult);
                }
            } catch (Exception e) {
                callbackLog(callbackParamList, "<br>----------- xxl-job job callback error, errorMsg:" + e.getMessage());
            }
        }
        if (!callbackRet) {
        	// 回调失败就记录日志
            appendFailCallbackFile(callbackParamList);
        }
    }

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值