|
|
|
@ -0,0 +1,95 @@
|
|
|
|
|
package com.xxl.job.admin.core.thread;
|
|
|
|
|
|
|
|
|
|
import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
|
|
|
|
|
import com.xxl.job.admin.core.model.XxlJobLog;
|
|
|
|
|
import com.xxl.job.admin.core.util.I18nUtil;
|
|
|
|
|
import com.xxl.job.core.biz.model.ReturnT;
|
|
|
|
|
import com.xxl.job.core.util.DateUtil;
|
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* job lose-monitor instance
|
|
|
|
|
*
|
|
|
|
|
* @author xuxueli 2015-9-1 18:05:56
|
|
|
|
|
*/
|
|
|
|
|
public class JobLosedMonitorHelper {
|
|
|
|
|
private static Logger logger = LoggerFactory.getLogger(JobLosedMonitorHelper.class);
|
|
|
|
|
|
|
|
|
|
private static JobLosedMonitorHelper instance = new JobLosedMonitorHelper();
|
|
|
|
|
public static JobLosedMonitorHelper getInstance(){
|
|
|
|
|
return instance;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ---------------------- monitor ----------------------
|
|
|
|
|
|
|
|
|
|
private Thread monitorThread;
|
|
|
|
|
private volatile boolean toStop = false;
|
|
|
|
|
public void start(){
|
|
|
|
|
monitorThread = new Thread(new Runnable() {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void run() {
|
|
|
|
|
|
|
|
|
|
// monitor
|
|
|
|
|
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") );
|
|
|
|
|
|
|
|
|
|
XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateHandleInfo(jobLog);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
if (!toStop) {
|
|
|
|
|
logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}", e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
TimeUnit.SECONDS.sleep(60);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
if (!toStop) {
|
|
|
|
|
logger.error(e.getMessage(), e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
logger.info(">>>>>>>>>>> xxl-job, job fail monitor thread stop");
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
monitorThread.setDaemon(true);
|
|
|
|
|
monitorThread.setName("xxl-job, admin JobFailMonitorHelper");
|
|
|
|
|
monitorThread.start();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void toStop(){
|
|
|
|
|
toStop = true;
|
|
|
|
|
// interrupt and wait
|
|
|
|
|
monitorThread.interrupt();
|
|
|
|
|
try {
|
|
|
|
|
monitorThread.join();
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
logger.error(e.getMessage(), e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|