问题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的