package com.hqyg.disjob.monitor.service; import java.lang.ref.SoftReference; import java.util.Date; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import com.hqyg.disjob.common.util.DateUtil; import com.hqyg.disjob.common.util.LoggerUtil; import com.hqyg.disjob.monitor.event.JobTracker; import com.hqyg.disjob.monitor.pojo.JobProgressTimeInfo; import com.hqyg.disjob.monitor.util.MonitorSpringWorkFactory; import com.hqyg.disjob.monitor.alarm.AlarmCondition; import com.hqyg.disjob.monitor.db.domain.DBJobBasicInfo; @Service("jobService") public class JobService{ private JobService(){ } private ConcurrentHashMap<String, JobTracker> jobTrackerMap = new ConcurrentHashMap<String, JobTracker>(); private ConcurrentHashMap<String, AlarmCondition> requestIdAlarmCondition = new ConcurrentHashMap<String, AlarmCondition>(); private ConcurrentHashMap<String, SoftReference<String>> requestKeyMap = new ConcurrentHashMap<String, SoftReference<String>>();//一个周期后remove public final static ConcurrentHashMap<String, AtomicInteger> receiveCount = new ConcurrentHashMap<String, AtomicInteger>(); public JobTracker newJobTracker(String requestId,String group,String jobName){ JobTracker jobTracker = jobTrackerMap.get(requestId); if(jobTracker == null){ jobTracker = new JobTracker(group,jobName); jobTrackerMap.put(requestId, jobTracker); } return jobTracker; } /** * 注意:这里可能会有一个 潜在的问题:一个job 在 3 倍 的超时间之后再将 进度信息发送回来的时候,这个时候来 get 已经 * 被 remove 掉了。因此如果拿不到,就临时创建一个 jobTracker 给他,仅仅是为了后续的操作。不影响。 * 修复时间:2016-12-28 11:25 * @param requestId * @return */ public JobTracker getJobTracker(String requestId){ JobTracker jobTracker = jobTrackerMap.get(requestId); if(jobTracker == null){ DBJobBasicInfo dbjobBasicInfo = MonitorSpringWorkFactory.getDBJobBasicInfoService().findByUuid(requestId); jobTracker = new JobTracker(dbjobBasicInfo.getGroupName(), dbjobBasicInfo.getJobName()); } return jobTracker; } public JobTracker removeJobTracker(String requestId){ return jobTrackerMap.remove(requestId); } public void setJobReceiveTime(String requestId,String receiveTime){ AlarmCondition alarmCondition = requestIdAlarmCondition.get(requestId); if(alarmCondition==null){ LoggerUtil.warn("超过3倍 times out:"+requestId+"; receive:"+receiveTime+"; at time:"+new Date().toString()); return ; } JobProgressTimeInfo jobProgressTimeInfo = alarmCondition.getObserviable(); jobProgressTimeInfo.setJobRecvTime(DateUtil.parse(receiveTime).getTime()); jobProgressTimeInfo.notifyProcess();//通知:处理是否执行超时 } public void setJobBeginTime(String requestId,String jobBegingTime){ AlarmCondition alarmCondition = requestIdAlarmCondition.get(requestId); if(alarmCondition == null){ LoggerUtil.warn("超过3倍 times out:"+requestId+"; receive:"+jobBegingTime+"; at time:"+new Date().toString()); return ; } JobProgressTimeInfo jobProgressTimeInfo = alarmCondition.getObserviable(); jobProgressTimeInfo.setJobBegingTime(DateUtil.parse(jobBegingTime).getTime()); jobProgressTimeInfo.notifyProcess();//通知:处理是否执行超时 } public void setJobCompleteTime(String requestId,String jobCompleteTime){ AlarmCondition alarmCondition = requestIdAlarmCondition.get(requestId); if(alarmCondition==null){ LoggerUtil.warn("超过3倍 times out:"+requestId+"; receive:"+jobCompleteTime+"; at time:"+new Date().toString()); return ; } JobProgressTimeInfo jobProgressTimeInfo = alarmCondition.getObserviable(); jobProgressTimeInfo.setJobCompleteTime(DateUtil.parse(jobCompleteTime).getTime()); jobProgressTimeInfo.notifyProcess();//通知:处理是否执行超时 } public void setJobSchedulerTime(String requestId){ JobProgressTimeInfo jobProgressTimeInfo = new JobProgressTimeInfo(requestId); jobProgressTimeInfo.setSchedulerStartTime(new Date().getTime()); setAlarmCondition(requestId, jobProgressTimeInfo); } /** * job 开始出发调度时就设置他的 报警condition * @param requestId */ private void setAlarmCondition(String requestId,JobProgressTimeInfo jobProgressTimeInfo){ this.requestIdAlarmCondition.put(requestId, new AlarmCondition(jobProgressTimeInfo,3)); } public AlarmCondition getAlarmCondition(String requestId){ return requestIdAlarmCondition.get(requestId); } public AlarmCondition removeAlarmCondition(String requestId){ return requestIdAlarmCondition.remove(requestId); } public void setRequestIdKey(String requestId,String key){ if(StringUtils.isNoneEmpty(requestId)&&StringUtils.isNotEmpty(key)){ requestKeyMap.put(requestId, new SoftReference<String>(key)); } } public String getRequestIdKey(String requestId){ if(StringUtils.isNoneEmpty(requestId)){ return requestKeyMap.get(requestId).get(); } return ""; } }