10. xxl-job原理---回调

作者: 光小月 | 来源:发表于2019-05-30 15:04 被阅读40次

    xxl-job: v2.0.2 原理 目录学习

    执行器

    在执行器开始的时候,会开启一个回调线程,TriggerCallbackThread.getInstance().start();
    该线程不断查找从 回调队列callBackQueue中查找回调信息,用就进行回调doCallback(callbackParamList);

    admin

    执行器通过回调线程,会调用admin中AdminBizImpl.callback() 方法, 然后执行。

    回调源代码

    AdminBizImpl.callback

    private ReturnT<String> callback(HandleCallbackParam handleCallbackParam) {
            // valid log item
            XxlJobLog log = xxlJobLogDao.load(handleCallbackParam.getLogId());
            if (log == null) {
                return new ReturnT<String>(ReturnT.FAIL_CODE, "log item not found.");
            }
            if (log.getHandleCode() > 0) {
                return new ReturnT<String>(ReturnT.FAIL_CODE, "log repeate callback.");     // avoid repeat callback, trigger child job etc
            }
    
            // trigger success, to trigger child job
            String callbackMsg = null;
            if (IJobHandler.SUCCESS.getCode() == handleCallbackParam.getExecuteResult().getCode()) {
                XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(log.getJobId());
                if (xxlJobInfo!=null && xxlJobInfo.getChildJobId()!=null && xxlJobInfo.getChildJobId().trim().length()>0) {
                    callbackMsg = "<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_child_run") +"<<<<<<<<<<< </span><br>";
    
                    String[] childJobIds = xxlJobInfo.getChildJobId().split(",");
                    for (int i = 0; i < childJobIds.length; i++) {
                        int childJobId = (childJobIds[i]!=null && childJobIds[i].trim().length()>0 && isNumeric(childJobIds[i]))?Integer.valueOf(childJobIds[i]):-1;
                        if (childJobId > 0) {
    
                            JobTriggerPoolHelper.trigger(childJobId, TriggerTypeEnum.PARENT, -1, null, null);
                            ReturnT<String> triggerChildResult = ReturnT.SUCCESS;
    
                            // add msg
                            callbackMsg += MessageFormat.format(I18nUtil.getString("jobconf_callback_child_msg1"),
                                    (i+1),
                                    childJobIds.length,
                                    childJobIds[i],
                                    (triggerChildResult.getCode()==ReturnT.SUCCESS_CODE?I18nUtil.getString("system_success"):I18nUtil.getString("system_fail")),
                                    triggerChildResult.getMsg());
                        } else {
                            callbackMsg += MessageFormat.format(I18nUtil.getString("jobconf_callback_child_msg2"),
                                    (i+1),
                                    childJobIds.length,
                                    childJobIds[i]);
                        }
                    }
    
                }
            }
    
            // handle msg
            StringBuffer handleMsg = new StringBuffer();
            if (log.getHandleMsg()!=null) {
                handleMsg.append(log.getHandleMsg()).append("<br>");
            }
            if (handleCallbackParam.getExecuteResult().getMsg() != null) {
                handleMsg.append(handleCallbackParam.getExecuteResult().getMsg());
            }
            if (callbackMsg != null) {
                handleMsg.append(callbackMsg);
            }
    
            // success, save log
            log.setHandleTime(new Date());
            log.setHandleCode(handleCallbackParam.getExecuteResult().getCode());
            log.setHandleMsg(handleMsg.toString());
            xxlJobLogDao.updateHandleInfo(log);
    
            return ReturnT.SUCCESS;
        }
    

    tips: 好像,只有有子任务的任务才可以进行回调, 如果想执行一个特定的命令时无法 进行回调

    PS: 若你觉得可以、还行、过得去、甚至不太差的话,可以“关注”一下,就此谢过!

    相关文章

      网友评论

        本文标题:10. xxl-job原理---回调

        本文链接:https://www.haomeiwen.com/subject/xtcvtctx.html