| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 | package com.xxl.job.admin.core.thread;import com.xxl.job.admin.core.conf.XxlJobAdminConfig;import com.xxl.job.admin.core.model.XxlJobInfo;import com.xxl.job.admin.core.model.XxlJobLog;import com.xxl.job.admin.core.trigger.TriggerTypeEnum;import com.xxl.job.admin.core.util.I18nUtil;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.List;import java.util.concurrent.TimeUnit;/** * job monitor instance * * @author xuxueli 2015-9-1 18:05:56 */public class JobFailMonitorHelper {	private static Logger logger = LoggerFactory.getLogger(JobFailMonitorHelper.class);		private static JobFailMonitorHelper instance = new JobFailMonitorHelper();	public static JobFailMonitorHelper 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 {						List<Long> failLogIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findFailJobLogIds(1000);						if (failLogIds!=null && !failLogIds.isEmpty()) {							for (long failLogId: failLogIds) {								// lock log								int lockRet = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, 0, -1);								if (lockRet < 1) {									continue;								}								XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(failLogId);								XxlJobInfo info = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(log.getJobId());								// 1、fail retry monitor								if (log.getExecutorFailRetryCount() > 0) {									JobTriggerPoolHelper.trigger(log.getJobId(), TriggerTypeEnum.RETRY, (log.getExecutorFailRetryCount()-1), log.getExecutorShardingParam(), log.getExecutorParam(), null);									String retryMsg = "<br><br><span style=\"color:#F39C12;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_type_retry") +"<<<<<<<<<<< </span><br>";									log.setTriggerMsg(log.getTriggerMsg() + retryMsg);									XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateTriggerInfo(log);								}								// 2、fail alarm monitor								int newAlarmStatus = 0;		// 告警状态:0-默认、-1=锁定状态、1-无需告警、2-告警成功、3-告警失败								if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) {									boolean alarmResult = XxlJobAdminConfig.getAdminConfig().getJobAlarmer().alarm(info, log);									newAlarmStatus = alarmResult?2:3;								} else {									newAlarmStatus = 1;								}								XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, -1, newAlarmStatus);							}						}					} catch (Exception e) {						if (!toStop) {							logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}", e);						}					}                    try {                        TimeUnit.SECONDS.sleep(10);                    } 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);		}	}}
 |