问题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);
		}
	}

如果执行到了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:端口/

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐