• xxl-job 执行成功,但是报“任务结果丢失,标记失败“错误


    问题1:使用xxl定时更新数据,发现执行结果是失败的

    在这里插入图片描述

    打开日志查看,发现没报错,结果是200

    在这里插入图片描述

    打开备注,上面写着"结果丢失".

    在这里插入图片描述

    再仔细对比下,发现外面日志列表中的执行时间是00:20:18;而日志记录中的最后时间是00:39:32;也就是说线程还没执行完,就先报结果错误了.

    在这里插入图片描述

    对比日志时间,会发现基本上都是在10分钟左右就直接报错

    既然是这样,那应该是跟xxl-job 的源码有关了,进入源码查看,发现在com.xxl.job.admin.core.thread包下的JobCompleteHelper类中,有如下代码

    while (!toStop) {
    	try {
    	// 任务结果丢失处理:调度记录停留在 "运行中" 状态超过10min,且对应执行器心跳注册失败不在线,则将本地调度主动标记失败;
    		Date losedTime = DateUtil.addMinutes(new Date(), -10);
    		List<Long> losedJobIds  = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findLostJobIds(losedTime);
    
    		if (losedJobIds!=null && losedJobIds.size()>0) {
    			for (Long logId: losedJobIds) {
    
    				XxlJobLog jobLog = new XxlJobLog();
    				jobLog.setId(logId);
    
    				jobLog.setHandleTime(new Date());
    				jobLog.setHandleCode(ReturnT.FAIL_CODE);
    				jobLog.setHandleMsg( I18nUtil.getString("joblog_lost_fail") );
    
    				XxlJobCompleter.updateHandleInfoAndFinish(jobLog);
    			}
    
    		}
    	} catch (Exception e) {
    		if (!toStop) {
    			logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}", e);
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    如果执行到了10分钟时,会会检测执行器是否还在,如果不在,直接报结果错误.

    可是我的执行器一直都在的,怎么会失败呢?原来此地检查是自动注册的执行器的,手动注册的检测不了;

    解决方法:将手动注入改为自动注入

    问题2:自动注入的地址不是执行器的ip地址,而是执行器所在的服务器上的docker的地址

    改为自动注册后,发现调用失败,查看执行器地址,发现能够ping的通,网络没问题.

    在这里插入图片描述

    去到执行器服务器使用ifconfig命令查看,发现注册的是docker的地址

    在这里插入图片描述

    对于这个问题,有人改源码,发现没用.最后是去改执行器配置文件中的

    xxl:
      job:
          executor:
          appname: sjhl-executor
          ### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
          address: http://执行器服务器ip:端口/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    重启执行器,就会发现自动注册的地址是配置文件中配置的,而不再是docker的

  • 相关阅读:
    数据库平滑扩容方案剖析
    从化区委刘棕会访从玉农业 林裕豪:再入大湾区菜篮子工程
    #名词区别篇:px、em、rem、rpx、vh、vw、vmin 、vmax、%用法 与 区别
    安防行业商业供应链系统:加速企业数字化升级,助推供应链平台一体化协同发展
    docker事件event查看筛选
    【vue.js】vue中的Ajax——json-server
    数据结构基础10:三路划分(解决快速排序的问题)
    Unity中Shader光照模型Phong的实现
    c 声明、定义、初始化的差别
    鄙视测试,理解测试,成为测试
  • 原文地址:https://blog.csdn.net/bushanyantanzhe/article/details/127978597