package com.nms.server.thread.detectDataHandler; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.LinkedBlockingDeque; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import com.fang.U; import com.fang.lang.Db; import com.fang.lang.StopWatch; import com.nms.server.bean.DetectInfo; import com.nms.server.bean.EmailInfo; import com.nms.server.common.Common; import com.nms.server.common.Constants; import com.nms.server.common.EmailTypeConstants; import com.nms.server.util.DateUtil; import com.nms.server.util.StringUtil; /** * detection_info 入库线程 * * @author nanfang * *1、从info队列中获取元素 2、判断状态 3、每取 n 个 执行一次批量入库 * * */ public class DetectInfoInsertThread implements Runnable { private static final Logger logger = Logger.getLogger(DetectInfoInsertThread.class); private final SimpleDateFormat format = Common.getFormat(); // Java Date // 类型数据格式化格式 private static Db db = Common.getDb(); private StopWatch sw ; private int count = 0;// 计数 // 监测设置对应的联系人email地址 Map> setInfoEmail = null; // 未指定的监测设置通过seqid找到对应的联系人 Map> seqIdEmail = null; private PreparedStatement infoStmt; private PreparedStatement warnStmt; private PreparedStatement emailStmt; private PreparedStatement statusChangeStmt; private PreparedStatement infoNewInsertStmt; private PreparedStatement infoNewUpdateStmt; private List insertDataTonew; private List updateDataTonew; private PreparedStatement warnUpdateStmt; private Connection conn;//使用的连接 @Override @SuppressWarnings({ "unchecked", "static-access" }) public void run() { Thread.currentThread().setName("DetectInfoInsertThread"); logger.info("开始运行"); sw = U.StopWatch.newStopWacth(); sw.start(); try { // info数据缓存队列 LinkedBlockingDeque infoQueue = Common.DETECT_QUEUE.get(DetectInfo.INFO_KEY); if (infoQueue != null && infoQueue.size() > 0) { conn = db.getConnection(); conn.setAutoCommit(false); Object[] info = null; List allInfo = U.newLinkedList(); List params = U.newLinkedList(); insertDataTonew=new ArrayList(); updateDataTonew=new ArrayList(); warnUpdateStmt=conn.prepareStatement(DetectInfo.getChangeWarningInfoSql()); int total = infoQueue.drainTo(allInfo);//一次性把队列的数据全部取出 for(int i = 0;i 0){ judgeAndSave(params); params.clear(); } allInfo.clear(); } else { logger.info("info queue is empty"); } } catch (Exception e) { logger.error("error", e); }finally { db.closeQuiet(infoStmt,warnStmt,emailStmt,statusChangeStmt,conn,infoNewInsertStmt,infoNewUpdateStmt); infoStmt = null; warnStmt = null; emailStmt = null; statusChangeStmt = null; setInfoEmail = null; seqIdEmail = null; conn = null; infoNewInsertStmt=null; infoNewUpdateStmt=null; } sw.end(); logger.info("监测数据info信息解析入库,耗时: " + U.StopWatch.toString(sw.total()) + " ,共 " + count + " 条"); sw = null; count = 0; } /** * 设置默认值 * @param detecInfo */ private void infoSetDefaultVal(Object[] detecInfo){ /** * 设置默认值 */ if(detecInfo[DetectInfo.STATE] == null){ detecInfo[DetectInfo.STATE] = -1;//state } if(detecInfo[DetectInfo.PLEVEL] == null){ detecInfo[DetectInfo.PLEVEL] = 99;//pLevel } if(detecInfo[DetectInfo.DELYFLAG] == null){ detecInfo[DetectInfo.DELYFLAG] = false;//delyFlag } if(detecInfo[DetectInfo.URGENTLEVEL] == null){ detecInfo[DetectInfo.URGENTLEVEL] = 0;//urgentLevel } if(detecInfo[DetectInfo.SENDEMAILFLAG] == null){ detecInfo[DetectInfo.SENDEMAILFLAG] = false;//sendEmailFlag } if(detecInfo[DetectInfo.STATECHANGEFLAG] == null){ detecInfo[DetectInfo.STATECHANGEFLAG] = false;//stateChangeFlag } if(detecInfo[DetectInfo.STATUSCHANGTIME] == null){ detecInfo[DetectInfo.STATUSCHANGTIME] = -1L;//statusChangeTime } } /** * 判断状态并保存 * * @param params */ private void judgeAndSave(List params) { sw.tag("s" + count); try { long l = System.currentTimeMillis(); sw.tag(l + "s"); //seqId,setId,list Map>> orInfo = orderInfo(params);// 整理数据 Set seqIds = orInfo.keySet(); // 获取 当前将要入库的数据 对应的 detection_info_new 表中的数据 Map> detectNewData = this.getDetectNewData(seqIds); // 判断状态变更 for (String seqId : seqIds) {//遍历即将入库的数据 Map> setMap = orInfo.get(seqId); Set>> setEn = setMap.entrySet(); for (Entry> si : setEn) { String setId = si.getKey();// 监测设置id List allDeteInfo = si.getValue();// 将要入库的info数据 Object[] oldDetecInfo = null;// new表中的最新记录 // 获取 数据库 中 new 表的对应值 Map seqMap = detectNewData.get(seqId); if (seqMap != null) { oldDetecInfo = seqMap.get(setId); } // 数据库中没有当前监测类别对应的seqid节点的监测信息,不需要判断状态变更 if (oldDetecInfo != null) { judgeStatus(allDeteInfo, oldDetecInfo); judgeAndCollect(allDeteInfo, oldDetecInfo, updateDataTonew); }else{//如果new表中没有数据,应为detection_info status_change_time设置初始值-->data_check_time if(allDeteInfo!=null&&allDeteInfo.size()>0){ for (Object[] newInfo : allDeteInfo) { if(newInfo[DetectInfo.STATUSCHANGTIME]==null||(Long)newInfo[DetectInfo.STATUSCHANGTIME]==-1){ newInfo[DetectInfo.STATUSCHANGTIME]= newInfo[DetectInfo.CHECKTIME]==null?newInfo[DetectInfo.STARTTIME]:newInfo[DetectInfo.CHECKTIME]; } } if(allDeteInfo.size()<2){ insertDataTonew.addAll(allDeteInfo); }else{ Collections.sort(allDeteInfo, new Comparator() { @Override public int compare(Object[] o1, Object[] o2) { Long time1 = (Long) o1[DetectInfo.CHECKTIME]; Long time2 = (Long) o2[DetectInfo.CHECKTIME]; return time1 < time2 ? -1 : 1; } }); insertDataTonew.add(allDeteInfo.get(0)); } } } } } sw.tag(l + "e"); logger.debug("告警判断完成,耗时:" + U.StopWatch.toString(sw.between(l + "e", l + "s")) ); // 入库 saveToNew(insertDataTonew, 0); saveToNew(updateDataTonew, 1); logger.info("info_new table update success! data size : "+(insertDataTonew.size()+updateDataTonew.size())); saveInfo(params); sw.tag(l + "sa"); logger.debug("入库完成,耗时:" + U.StopWatch.toString(sw.between(l + "sa", l + "e")) ); } catch (Exception e) { logger.error("detect info save error", e); } sw.tag("e" + count); logger.info("批量保存info,耗时: " + U.StopWatch.toString(sw.between("e" + count, "s" + count))); } /** * 保存 * * @param infoList * @throws SQLException */ private void saveInfo(List infoList) throws SQLException { Object[] temInfo = null; try { int infoCount = infoList.size(); int warnCount = 0; int emailCount = 0; Map statusChangeMap = U.newHashMap(); boolean emailFlag = Constants.flag_email == 1;// 是否启用 email Iterator ite = infoList.iterator(); while (ite.hasNext()) { temInfo = ite.next(); // 计算 详细表的 外键 时间戳(10) + seqId(5)+ setId (3),主要是为了使用 java 中long 类型 String checkTime = temInfo[DetectInfo.CHECKTIME].toString(); String setId = temInfo[DetectInfo.SETINFOID].toString(); String seqId = temInfo[DetectInfo.SEQID].toString(); String checkType = temInfo[DetectInfo.CHECKTYPE].toString();//监测类别 String id = DetectInfo.computeId(checkTime, seqId, setId); Object[] infoParam = new Object[] { id, setId, (String) temInfo[DetectInfo.DSINFO], (String) temInfo[DetectInfo.PDATA], temInfo[DetectInfo.CURRENTTIMES] + "", temInfo[DetectInfo.STARTTIME] != null ? format.format(new Date((Long) temInfo[DetectInfo.STARTTIME])) : null, temInfo[DetectInfo.DELAYTIME] + "", temInfo[DetectInfo.NEXTCHECKTIME] != null ? format.format(new Date((Long) temInfo[DetectInfo.NEXTCHECKTIME])) : null, temInfo[DetectInfo.PLEVEL], temInfo[DetectInfo.CHECKTIME] != null? format.format(new Date((Long) temInfo[DetectInfo.CHECKTIME])) : null, temInfo[DetectInfo.ARRIVETIME] != null? format.format(new Date((Long) temInfo[DetectInfo.ARRIVETIME])) : null, temInfo[DetectInfo.STATE] , checkTime, temInfo[DetectInfo.ARRIVETIME] , seqId, temInfo[DetectInfo.URGENTLEVEL] , temInfo[DetectInfo.STATUSCHANGTIME] != null ? format.format(new Date((Long) temInfo[DetectInfo.STATUSCHANGTIME])) : null, Common.SEQUENCE.get(DetectInfo.DETECTION_INFO)==null?null:Common.SEQUENCE.get(DetectInfo.DETECTION_INFO).incrementAndGet()}; if(Common.SEQUENCE.get(DetectInfo.DETECTION_INFO)==null){ infoParam=Arrays.copyOf(infoParam, infoParam.length-1); } if(infoStmt == null){ infoStmt = conn.prepareStatement(DetectInfo.getInsertInfoSql()); infoStmt.setQueryTimeout(Constants.DB_STATEMENT_EXECUTE_TIMEOUT); } addRecordToStatement(infoStmt, infoParam); infoCount ++; // 添加告警信息:告警信息=状态异常+状态改变+推迟入库的 if ((Integer) temInfo[DetectInfo.STATE] != 1 || (Boolean) temInfo[DetectInfo.STATECHANGEFLAG]) { Object[] params = new Object[] { id, (String) temInfo[DetectInfo.SETINFOID], (String) temInfo[DetectInfo.DSINFO], (String) temInfo[DetectInfo.PDATA], temInfo[DetectInfo.CURRENTTIMES] , temInfo[DetectInfo.STARTTIME] != null ? format.format(new Date((Long) temInfo[DetectInfo.STARTTIME])) : null, temInfo[DetectInfo.DELAYTIME] , temInfo[DetectInfo.NEXTCHECKTIME] != null ? format.format(new Date((Long) temInfo[DetectInfo.NEXTCHECKTIME])) : null, temInfo[DetectInfo.PLEVEL] , temInfo[DetectInfo.CHECKTIME] != null ? format.format(new Date((Long) temInfo[DetectInfo.CHECKTIME])) : null, temInfo[DetectInfo.ARRIVETIME] != null ? format.format(new Date((Long) temInfo[DetectInfo.ARRIVETIME])) : null, temInfo[DetectInfo.STATE] , temInfo[DetectInfo.CHECKTIME] , temInfo[DetectInfo.ARRIVETIME] , (String) temInfo[DetectInfo.SEQID], temInfo[DetectInfo.URGENTLEVEL] }; if(warnStmt == null){ warnStmt = conn.prepareStatement(DetectInfo.getInsertWarningSql()); warnStmt.setQueryTimeout(Constants.DB_STATEMENT_EXECUTE_TIMEOUT); } addRecordToStatement(warnStmt, params); warnCount++; } // 延迟监测数据追加告警信息 if (temInfo[DetectInfo.APPENDWARNINGINFO] != null) { Object[] warningInfo = (Object[]) temInfo[DetectInfo.APPENDWARNINGINFO]; Object[] params = new Object[] { warningInfo[DetectInfo.DETECTIONINFOID], (String) warningInfo[DetectInfo.SETINFOID], (String) warningInfo[DetectInfo.DSINFO], (String) warningInfo[DetectInfo.PDATA], warningInfo[DetectInfo.CURRENTTIMES] , warningInfo[DetectInfo.STARTTIME] != null ? format.format(new Date((Long) temInfo[DetectInfo.STARTTIME])) : null, warningInfo[DetectInfo.DELAYTIME] , warningInfo[DetectInfo.NEXTCHECKTIME] != null ? format.format(new Date((Long) temInfo[DetectInfo.NEXTCHECKTIME])) : null, warningInfo[DetectInfo.PLEVEL] , warningInfo[DetectInfo.CHECKTIME] != null ? format.format(new Date((Long) temInfo[DetectInfo.CHECKTIME])) : null, warningInfo[DetectInfo.ARRIVETIME] != null ? format.format(new Date((Long) temInfo[DetectInfo.ARRIVETIME])) : null, warningInfo[DetectInfo.STATE] , warningInfo[DetectInfo.CHECKTIME] , warningInfo[DetectInfo.ARRIVETIME] , warningInfo[DetectInfo.SEQID], warningInfo[DetectInfo.URGENTLEVEL] }; if(warnStmt == null){ warnStmt = conn.prepareStatement(DetectInfo.getInsertWarningSql()); warnStmt.setQueryTimeout(Constants.DB_STATEMENT_EXECUTE_TIMEOUT); } addRecordToStatement(warnStmt, params); warnCount++; } // 添加邮件信息 if (!emailFlag) { logger.info("邮件功能已关闭"); } else { if ((Boolean) temInfo[DetectInfo.SENDEMAILFLAG]) { EmailInfo emailInfo = (EmailInfo) temInfo[DetectInfo.EMAILINFO]; if (emailInfo != null) { if (setInfoEmail == null) { setInfoEmail = this.getDetecSetEmailListOf123(); } if (seqIdEmail == null) { seqIdEmail = this.getDetecEmailListOf4(); } if ((setInfoEmail == null || setInfoEmail.size() == 0) && (seqIdEmail == null || seqIdEmail.size() == 0)) { logger.debug("未找到邮件地址!"); } else { List emailAddress = null; // 1.首先通过监测设置的map中查找 if (setInfoEmail != null) { emailAddress = setInfoEmail.get(setId); } if (emailAddress == null) { emailAddress = seqIdEmail.get(seqId); } if (emailAddress != null && emailAddress.size() > 0) { for (String tempAddress : emailAddress) { if (StringUtils.isNotEmpty(tempAddress)) { Object[] params = new Object[] { tempAddress, emailInfo.getActionType(), emailInfo.getContent(), emailInfo.getSendFlag(), emailInfo.getActionIp(), emailInfo.getActionDate(), emailInfo.getActionDesc(), emailInfo.getSendLevel(), DateUtil.getCurrentTime() }; if(emailStmt == null){ emailStmt = conn.prepareStatement(DetectInfo.getInsertEmailSql()); emailStmt.setQueryTimeout(Constants.DB_STATEMENT_EXECUTE_TIMEOUT); } addRecordToStatement(emailStmt, params); emailCount ++; } } } } } } } if(Constants.DETEC_NMSC_STR.equalsIgnoreCase(checkType)){ long temChangeTime = (Long) temInfo[DetectInfo.STATUSCHANGTIME]; if(temChangeTime > 0 ){ Long l = statusChangeMap.get(seqId); if(l == null || temChangeTime > l){ statusChangeMap.put(seqId, temChangeTime); } } } ite.remove(); } if(infoCount >0){ infoStmt.executeBatch(); } if(warnCount >0){ warnStmt.executeBatch(); } if(emailCount >0){ emailStmt.executeBatch(); } if(statusChangeMap.size() > 0){ if(statusChangeStmt == null){ statusChangeStmt = conn.prepareStatement(DetectInfo.getUpdateStatusSql()); statusChangeStmt.setQueryTimeout(Constants.DB_STATEMENT_EXECUTE_TIMEOUT); } Set> entrySet = statusChangeMap.entrySet(); for(Entry en : entrySet){ Object[] params = {en.getValue()!=null?format.format(new Date((Long)en.getValue())):null,en.getKey()}; addRecordToStatement(statusChangeStmt, params); } statusChangeStmt.executeBatch(); } warnUpdateStmt.executeBatch();//update warning conn.commit(); logger.info("批量保存,info :" + infoCount + " , warn : " + warnCount + " ,email : "+ emailCount); } catch (Exception e) { logger.error("info save error ,temInfo : "+Arrays.toString(temInfo) ,e); conn.rollback(); }finally { if(infoStmt != null){ infoStmt.clearBatch(); } if(warnStmt != null){ warnStmt.clearBatch(); } if(emailStmt != null){ emailStmt.clearBatch(); } if(statusChangeStmt != null){ statusChangeStmt.clearBatch(); } } } private Map> getDetecEmailListOf4() { Map> result = new HashMap>(); try { StringBuilder sb = new StringBuilder(); sb.append(" select distinct nt.seq_id ,xyj.email"); sb.append(" from xt_yh_jbxx xyj "); sb.append(" left join xt_yh_js_index xyji "); sb.append(" on xyji.yhid = xyj.yhid "); sb.append(" left join xt_js_jbxx xjj "); sb.append(" on xjj.jsbh = xyji.jsbh "); sb.append(" left join gorup_system_table gst "); sb.append(" on gst.user_group_id = xjj.jsbh "); sb.append(" left join system_table st "); sb.append(" on st.system_id = gst.system_id "); sb.append(" left join node_table nt "); sb.append(" on nt.system_id = gst.system_id "); sb.append(" left join nodegroup_table ngt "); sb.append(" on ngt.group_id = nt.node_group_id "); sb.append(" where xyj.is_receiveemail = '0' "); sb.append(" and nt.node_state = 0 "); sb.append(" and ngt.is_valid = 1 "); sb.append(" and st.system_state = 0 "); sb.append(" and xjj.zxbz = 0 "); sb.append(" and xjj.type = 1 "); sb.append(" and xyj.zxbz = 0 "); List> map1 = db.select(conn, sb.toString()); if(map1 != null && map1.size()>0){ List tempList = null; String email = null; String seqId = null; for(Map temp : map1){ seqId = (String)temp.get("seq_id"); email = (String)temp.get("email"); tempList = result.get(seqId); if(tempList == null){//第一次添加 List emailList = new ArrayList(); emailList.add(email); result.put(seqId, emailList); }else{ tempList.add(email); } seqId = null; email = null; tempList = null; } } } catch (Exception e) { logger.debug("查询邮件列表失败",e); } return result; } private Map> getDetecSetEmailListOf123() { Map> result = new HashMap>(); StringBuilder sb = new StringBuilder(); sb.append(" select distinct c.id, xyj1.email "); sb.append(" from xt_yh_jbxx xyj1, "); sb.append(" (select dsi.id, ',' || dsi.contact_user_ids || ',' as ids "); sb.append(" from detection_set_info dsi "); sb.append(" where dsi.contact_user_ids is not null) c "); sb.append(" where c.ids like ('%,' || xyj1.yhid || ',%') "); sb.append(" and xyj1.email is not null "); sb.append(" union "); sb.append(" (select distinct dsi.id,xyj.email "); sb.append(" from detection_set_info dsi "); sb.append(" left join xt_js_jbxx xjj "); sb.append(" on dsi.create_usergroup_id = xjj.jsbh "); sb.append(" left join xt_yh_js_index xyji "); sb.append(" on xjj.jsbh = xyji.jsbh "); sb.append(" left join xt_yh_jbxx xyj "); sb.append(" on xyj.yhid = xyji.yhid "); sb.append(" where xyj.is_receiveemail = '0' "); sb.append(" and xjj.zxbz = 0 "); sb.append(" and xjj.type = 1 "); sb.append(" and xyj.zxbz = 0 "); sb.append(" and dsi.view_level = 2 "); sb.append(" and xyj.email is not null "); sb.append(" and dsi.create_usergroup_id is not null "); sb.append(" and dsi.contact_user_ids is null) "); sb.append(" union "); sb.append(" ( "); sb.append(" select distinct dsi.id,xyj.email from detection_set_info dsi "); sb.append(" left join gorup_system_table gst "); sb.append(" on gst.system_id = dsi.system_id "); sb.append(" left join xt_js_jbxx xjj "); sb.append(" on gst.user_group_id = xjj.jsbh "); sb.append(" left join xt_yh_js_index xyji "); sb.append(" on xjj.jsbh = xyji.jsbh "); sb.append(" left join xt_yh_jbxx xyj "); sb.append(" on xyji.yhid = xyj.yhid "); sb.append(" where xyj.is_receiveemail = '0' "); sb.append(" and xjj.zxbz = 0 "); sb.append(" and xjj.type = 1 "); sb.append(" and xyj.zxbz = 0 "); sb.append(" and dsi.view_level = 3 "); sb.append(" and xyj.email is not null "); sb.append(" and dsi.contact_user_ids is null "); sb.append(" ) "); try { List> map1 = db.select(conn, sb.toString()); if(map1 != null && map1.size()>0){ List tempList = null; String email = null; String id = null; for(Map temp : map1){ id = (String)temp.get("id"); email = (String)temp.get("email"); tempList = result.get(id); if(tempList == null){//第一次添加 List emailList = new ArrayList(); emailList.add(email); result.put(id, emailList); }else{ tempList.add(email); } id = null; email = null; tempList = null; } } } catch (Exception e) { logger.debug("查询邮件列表失败",e); } return result; } /** * 判断状态变更 * * @param allDeteInfo 单条监测设置id下的 监测数据 * @param oldDetecInfo new表中对应监测设置id下的监测数据 */ private void judgeStatus(List allDeteInfo, Object[] oldDetecInfo) { if (allDeteInfo.size() < 2) {// 只有一条数据直接比较数据库中的数据 // 只有一条最新监测 Object[] newDetecInfo = allDeteInfo.get(0); int state = (Integer) newDetecInfo[DetectInfo.STATE]; /* * 入库数据不是延时数据时,与数据库中的最新数据比对判断状态变更 数据库中的监测时间小于当前需要入库的监测时间 */ if ((Long) oldDetecInfo[DetectInfo.CHECKTIME] < (Long) newDetecInfo[DetectInfo.CHECKTIME]) { /* 判断状态变更 */ stateChange(newDetecInfo, oldDetecInfo); } else {// 监测时间小于数据库中监测数据的时间,说明当前需要入库的监测为延迟数据 if (state != 1) {// 延迟数据监测状态没有成功,数据库入库的是正常数据,补录一条报警信息 if ((Integer) newDetecInfo[DetectInfo.STATE] == 1 && (Integer) oldDetecInfo[DetectInfo.PLEVEL] == 99) { newDetecInfo[DetectInfo.APPENDWARNINGINFO] = oldDetecInfo; } } } } else {// 大于两条数据时,排序之后判断数据库的数据是否为最接近的时间数据 // 未入库的数据排序 Collections.sort(allDeteInfo, new Comparator() { @Override public int compare(Object[] o1, Object[] o2) { Long time1 = (Long) o1[DetectInfo.CHECKTIME]; Long time2 = (Long) o2[DetectInfo.CHECKTIME]; return time1 < time2 ? -1 : 1; } }); /* 判断状态变更 */ judgeState(allDeteInfo, oldDetecInfo); } } /** * 整理 缓存中的 info 数据,方便 判断告警信息 * * @param params * @return */ private Map>> orderInfo(List params) { Map>> result = U.newHashMap(); // 先将所有的数据整理成 结果集合 for (Object[] item : params) { String seqId = (String) item[DetectInfo.SEQID]; String setId = (String) item[DetectInfo.SETINFOID]; Map> setMap = result.get(seqId); if (setMap == null) { List l = U.newArrayList(); l.add(item); setMap = U.newHashMap(); setMap.put(setId, l); result.put(seqId, setMap); } else { List list = setMap.get(setId); if (list == null) { list = U.newArrayList(); list.add(item); setMap.put(setId, list); } else { list.add(item); } } } // 将list排序 if (result.size() > 0) { Set>>> seqEn = result.entrySet(); for (Entry>> se : seqEn) { Map> setMap = se.getValue(); Set>> setEn = setMap.entrySet(); for (Entry> st : setEn) { List list = st.getValue(); if (list.size() > 1) { // 统一seqid setid 的数据排序 Collections.sort(list, new Comparator() { @Override public int compare(Object[] o1, Object[] o2) { if (o1 != null && o2 != null) { long l1 = (long) o1[DetectInfo.CHECKTIME]; long l2 = (long) o2[DetectInfo.CHECKTIME]; return l1 < l2 ? -1 : 1; } return 0; } }); } } } } return result; } /** * 查询 detection_info_new 表中的最新数据 * * @param seqId * @return */ private Map> getDetectNewData(Collection seqId) { Map> result = U.newHashMap(); try { String seqIds = StringUtils.join(seqId.iterator(), ","); StringBuilder sbSql = new StringBuilder(); sbSql.append( "select din.ID,din.DETECTION_SET_INFO_ID,din.CHECK_WAY,din.DETECTION_STATE_INFO,din.PERFORMACE_DATA,din.CURRENT_TIMES,din.START_TIME,din.WAIT_TIME,din.DELAY_TIME,din.NEXT_CHECK_TIME,din.OFF_LINE,din.POLICE_LEVEL,din.DATA_CHECK_TIME,din.DATA_ARRIVE_TIME,din.DETECTIONED_STATE,din.NODE_IP,din.STATUS_CHANGE_TIME,din.DATA_CHECK_TIME_DIGITAL,din.DATA_ARRIVE_TIME_DIGITAL,din.SEQ_ID,din.DETECTION_INFO_ID,din.VALID,din.POLICE_EMERGENT"); sbSql.append(" from detection_info_new din "); sbSql.append(" where "); sbSql.append(" din.seq_id in ( "); sbSql.append(seqIds); sbSql.append(" )"); String sql = sbSql.toString(); List> list = db.select(conn,sql); if (list != null) { for (Map item : list) { Object[] obj = new Object[33]; String seq = item.get("SEQ_ID").toString(); String setId = item.get("DETECTION_SET_INFO_ID").toString(); obj[DetectInfo.SETINFOID] = setId; obj[DetectInfo.SEQID] = seq; obj[DetectInfo.STATE] = (item.get("DETECTIONED_STATE") == null ? null : Integer.parseInt(item.get("DETECTIONED_STATE").toString())); obj[DetectInfo.CHECKTIME] = (item.get("DATA_CHECK_TIME_DIGITAL") == null ? null : Long.parseLong(item.get("DATA_CHECK_TIME_DIGITAL").toString())); obj[DetectInfo.PLEVEL] = (item.get("POLICE_LEVEL") == null ? -1 : Integer.parseInt(item.get("POLICE_LEVEL").toString())); obj[DetectInfo.URGENTLEVEL] = (item.get("POLICE_EMERGENT") == null ? -1 : Integer.parseInt(item.get("POLICE_EMERGENT").toString())); obj[DetectInfo.DETECTIONINFOID] = (item.get("DETECTION_INFO_ID")); obj[DetectInfo.STATUSCHANGTIME] = (item.get("STATUS_CHANGE_TIME") == null ? null : ((Date) item.get("STATUS_CHANGE_TIME")).getTime()); obj[DetectInfo.ARRIVETIME] = (item.get("DATA_ARRIVE_TIME_DIGITAL") == null ? null : Long.parseLong(item.get("DATA_ARRIVE_TIME_DIGITAL").toString())); obj[DetectInfo.DELAYTIME] = (item.get("DELAY_TIME") == null ? null : Integer.parseInt(item.get("DELAY_TIME").toString())); obj[DetectInfo.NEXTCHECKTIME] = (item.get("NEXT_CHECK_TIME") == null ? null : ((Date) item.get("NEXT_CHECK_TIME")).getTime()); obj[DetectInfo.STARTTIME] = (item.get("START_TIME") == null ? null : ((Date) item.get("START_TIME")).getTime()); obj[DetectInfo.DSINFO] = (item.get("DETECTION_STATE_INFO")); obj[DetectInfo.PDATA] = (item.get("PERFORMACE_DATA")); obj[DetectInfo.CURRENTTIMES] = (item.get("CURRENT_TIMES") == null ? -1 : Integer.parseInt(item.get("CURRENT_TIMES").toString())); // 将数据库中的最新数据组织成 seqId setId data Map map = result.get(seq); if (map == null) { map = U.newHashMap(); map.put(setId, obj); result.put(seq, map); } else { map.put(setId, obj); } } return result; } } catch (Exception e) { logger.warn("select detection_info_new error", e); } return result; } /** * 判断状态变更具体实现 * * @param newDetecInfo 准备入库数据 * * @param oldDetecInfo new表中的数据 */ private void stateChange(Object[] newDetecInfo, Object[] oldDetecInfo) { /** * 判断状态变更 */ if (newDetecInfo == null || oldDetecInfo == null || ((Long) newDetecInfo[DetectInfo.CHECKTIME] < (Long) oldDetecInfo[DetectInfo.CHECKTIME])) { return; } if (((Integer) oldDetecInfo[DetectInfo.STATE] != (Integer) newDetecInfo[DetectInfo.STATE]) || // 状态改变 (((Integer) oldDetecInfo[DetectInfo.STATE] == (Integer) newDetecInfo[DetectInfo.STATE] && (Integer) oldDetecInfo[DetectInfo.PLEVEL] != (Integer) newDetecInfo[DetectInfo.PLEVEL]))) {// 状态未变,告警级别改变 int state = (Integer) newDetecInfo[DetectInfo.STATE]; // 邮件告警信息 StringBuffer alarmInfo = new StringBuffer((String) newDetecInfo[DetectInfo.ALARMINFO]);// 告警信息 String dsinfo = (String) newDetecInfo[DetectInfo.DSINFO];// 状态信息 String checkType = (String) newDetecInfo[DetectInfo.CHECKTYPE];// 监测类别 long checkTime = (Long) newDetecInfo[DetectInfo.CHECKTIME]; int actionType = 11; int urgentLevel = EmailTypeConstants.URGENT_LATER; // 整理告警数据,拼写邮件信息 if (state == -1) { // 执行失败 // alarmInfo.append("监测执行失败\n "); // alarmInfo.append("Failure to monitor execution\n "); alarmInfo.append("i18n_server.DetecDataResoveThread.alarmInfo1_n81i\n "); alarmInfo.append(dsinfo + "\n"); actionType = EmailTypeConstants.TYPE_DETECTION_INFO_EXCEPTION; if (Constants.DETEC_NMSC_STR.equalsIgnoreCase(checkType)) { urgentLevel = EmailTypeConstants.URGENT_IMMEDIATELY; } } else if (state == 0) { // 一般异常 alarmInfo.append(" " + dsinfo + "\n"); // 如果是握手监测,不添加告警设置字段相关信息 if (!Constants.DETEC_NMSC_STR.equalsIgnoreCase(checkType)) { alarmInfo.append(dsinfo + " \n"); } else { alarmInfo.delete(0, alarmInfo.length());// 如果是握手监测,则不添加告警设置字段相关信息 alarmInfo.append(dsinfo + " \n"); urgentLevel = EmailTypeConstants.URGENT_IMMEDIATELY; } actionType = EmailTypeConstants.TYPE_DETECTION_INFO_EXCEPTION; } else if (state == 1) { // 恢复正常 // alarmInfo.append("监测恢复正常"); // alarmInfo.append("Monitoring back to normal"); alarmInfo.append("i18n_server.DetecDataResoveThread.alarmInfo1_n81i"); actionType = EmailTypeConstants.TYPE_DETECTION_INFO_RECOVER; urgentLevel = EmailTypeConstants.URGENT_LATER; // 更新该节点所有监测时间为当前监测时间 if (checkType.equalsIgnoreCase(Constants.DETEC_NMSC_STR)) { newDetecInfo[DetectInfo.STATUSCHANGTIME] = (checkTime); } // //update warning table // collectWarnUpdateInfo(newDetecInfo); } // 报警通知 newDetecInfo[DetectInfo.STATECHANGEFLAG] = (true); newDetecInfo[DetectInfo.ALARMINFO] = (alarmInfo.toString()); newDetecInfo[DetectInfo.SENDEMAILFLAG] = (true); newDetecInfo[DetectInfo.URGENTLEVEL] = (urgentLevel); // 目前代码中是否紧急和紧急级别不对应,有的是紧急,但是级别是2,所以此处进行修改,如果是紧急,则级别修改为0级 if (EmailTypeConstants.URGENT_IMMEDIATELY == urgentLevel) { newDetecInfo[DetectInfo.PLEVEL] = Constants.LEVEL_OF_EMERGENCY; } // 如果是0级,则设置为紧急,使得紧急状态和级别一致 if (newDetecInfo[DetectInfo.PLEVEL].equals(Constants.LEVEL_OF_EMERGENCY)) { newDetecInfo[DetectInfo.URGENTLEVEL] = EmailTypeConstants.URGENT_IMMEDIATELY; } long seqIdLong = Long.parseLong((String) newDetecInfo[DetectInfo.SEQID]); long setInfoIdLong = Long.parseLong((String) newDetecInfo[DetectInfo.SETINFOID]); String emailContent = alarmInfo.toString(); if (emailContent.getBytes().length > 290) { emailContent = StringUtil.substring(emailContent, 290); } EmailInfo emailInfo = new EmailInfo(actionType, Common.getSetInfoNameMape().get(setInfoIdLong) + "(" + Common.getCheckTypeNameMape().get(checkType) + ")", Common.getNodeIpByUUID(seqIdLong), format.format(new Date(checkTime)), emailContent, EmailTypeConstants.FLAG_SEND_LATER, urgentLevel); newDetecInfo[DetectInfo.EMAILINFO] = (emailInfo); //如果新入数据和new表中的监测状态不同,或者监测状态相同,告警级别不同 ,修改 状态改变时间 为获取新入数据的时间(data_check_time) newDetecInfo[DetectInfo.STATUSCHANGTIME]=newDetecInfo[DetectInfo.CHECKTIME]; } else{//如果新入数据和new表中的监测状态相同,且告警级别相同 ,则状态改变时间更新为new表中的时间 newDetecInfo[DetectInfo.STATUSCHANGTIME]=oldDetecInfo[DetectInfo.STATUSCHANGTIME]; } } /** * 状态变更判断:只对大于等于new表监测时间的监测数据进行是否告警的判断 * * @param allDetectInfo * @param inDbInfo */ private void judgeState(List allDetectInfo, Object[] inDbInfo) { /* * 判断每一个的状态变更 1.监测时间小于已经入库的监测数据时间不做判断 */ int startIndex = 0; for (int i = 0, j = allDetectInfo.size(); i < j; i++) { Object[] newDetecInfo = allDetectInfo.get(i); Object[] oldDetecInfo = null;// 前一条监测数据 // 监测时间小于已经入库的监测数据时间不做判断,只在最后一条数据判断插入告警信息 if (newDetecInfo == null || (Long) newDetecInfo[DetectInfo.CHECKTIME] < (Long) inDbInfo[DetectInfo.CHECKTIME]) { startIndex++; if (i < j - 1) { continue; } else { // 集合中的最后一条数据监测时间也小于数据库中的时间时,最后一条数据判断是否插入一条告警信息 if ((Integer) newDetecInfo[DetectInfo.STATE] != 1) {// 延迟数据监测状态没有成功,数据库入库的是正常数据,补录一条报警信息 if ((Integer) inDbInfo[DetectInfo.STATE] == 1 && (Integer) inDbInfo[DetectInfo.PLEVEL] == 99) { newDetecInfo[DetectInfo.APPENDWARNINGINFO] = oldDetecInfo; } } } } // 判断最新的监测数据 if (i == startIndex) { oldDetecInfo = inDbInfo; } else { oldDetecInfo = allDetectInfo.get(i - 1); } /* 判断状态变更 */ stateChange(newDetecInfo, oldDetecInfo); } } /** * stmt addbatch * @param stmt * @param params * @throws SQLException */ private void addRecordToStatement(PreparedStatement stmt, Object[] params) throws SQLException { if (params != null) { logger.debug(" params " + Arrays.toString(params)); for (int i = 0; i < params.length; i++) { stmt.setObject(i + 1, params[i]); } stmt.addBatch(); } } /** * @param allDeteInfo * @param oldDetecInfo * @param newDataList */ private void judgeAndCollect(List allDeteInfo, Object[] oldDetecInfo,List newDataList){ Object[] newDeteInfo = allDeteInfo.get(0); if((Long)newDeteInfo[DetectInfo.CHECKTIME]>(Long)oldDetecInfo[DetectInfo.CHECKTIME]){ newDataList.add(newDeteInfo); } if((Integer)newDeteInfo[DetectInfo.STATE]==1){ Object[] params={newDeteInfo[DetectInfo.SEQID],newDeteInfo[DetectInfo.SETINFOID]}; try { addRecordToStatement(warnUpdateStmt, params); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private void saveToNew(List dataList,int flag){ if(dataList!=null&&dataList.size()>0){ if(flag==0){//insert String sql=DetectInfo.getSaveToNewSql(); try { infoNewInsertStmt=conn.prepareStatement(sql); for (Object[] newData : dataList) { // 计算 详细表的 外键 时间戳(10) + seqId(5)+ setId (3),主要是为了使用 java 中long 类型 String checkTime = newData[DetectInfo.CHECKTIME].toString(); String setId = newData[DetectInfo.SETINFOID].toString(); String seqId = newData[DetectInfo.SEQID].toString(); String id = DetectInfo.computeId(checkTime, seqId, setId); Object []params={ newData[DetectInfo.SETINFOID], newData[DetectInfo.DSINFO], newData[DetectInfo.PDATA], newData[DetectInfo.CURRENTTIMES], newData[DetectInfo.STARTTIME] != null ? format.format(new Date((Long) newData[DetectInfo.STARTTIME])) : null, newData[DetectInfo.WAITTIME], newData[DetectInfo.DELAYTIME], newData[DetectInfo.NEXTCHECKTIME]!= null ? format.format(new Date((Long) newData[DetectInfo.NEXTCHECKTIME])) : null, newData[DetectInfo.PLEVEL], newData[DetectInfo.CHECKTIME]!= null ? format.format(new Date((Long) newData[DetectInfo.CHECKTIME])) : null, newData[DetectInfo.ARRIVETIME]!= null ? format.format(new Date((Long) newData[DetectInfo.ARRIVETIME])) : null, newData[DetectInfo.STATE], newData[DetectInfo.STATUSCHANGTIME]!= null ? format.format(new Date((Long) newData[DetectInfo.STATUSCHANGTIME])) : null, newData[DetectInfo.SEQID], id, newData[DetectInfo.CHECKTIME], newData[DetectInfo.ARRIVETIME], newData[DetectInfo.URGENTLEVEL] }; addRecordToStatement(infoNewInsertStmt, params); } infoNewInsertStmt.executeBatch(); logger.info("info_new table insert success! size : "+ dataList.size()); } catch (SQLException e) { logger.error("save info to info_new table error"+e.getMessage()); } }else if(flag==1){//update String sql=DetectInfo.getUpdateToNewSql(); try { infoNewUpdateStmt=conn.prepareStatement(sql); for (Object[] newData : dataList) { // 计算 详细表的 外键 时间戳(10) + seqId(5)+ setId (3),主要是为了使用 java 中long 类型 String checkTime = newData[DetectInfo.CHECKTIME].toString(); String setId = newData[DetectInfo.SETINFOID].toString(); String seqId = newData[DetectInfo.SEQID].toString(); String id = DetectInfo.computeId(checkTime, seqId, setId); Object []params={newData[DetectInfo.DSINFO], newData[DetectInfo.PDATA], newData[DetectInfo.CURRENTTIMES], newData[DetectInfo.STARTTIME] != null ? format.format(new Date((Long) newData[DetectInfo.STARTTIME])) : null, newData[DetectInfo.WAITTIME], newData[DetectInfo.DELAYTIME], newData[DetectInfo.NEXTCHECKTIME]!= null ? format.format(new Date((Long) newData[DetectInfo.NEXTCHECKTIME])) : null, newData[DetectInfo.PLEVEL], newData[DetectInfo.CHECKTIME]!= null ? format.format(new Date((Long) newData[DetectInfo.CHECKTIME])) : null, newData[DetectInfo.ARRIVETIME]!= null ? format.format(new Date((Long) newData[DetectInfo.ARRIVETIME])) : null, newData[DetectInfo.STATE], newData[DetectInfo.STATUSCHANGTIME]!= null && (Long)newData[DetectInfo.STATUSCHANGTIME]!= -1? format.format(new Date((Long) newData[DetectInfo.STATUSCHANGTIME])) : null, id, newData[DetectInfo.CHECKTIME], newData[DetectInfo.ARRIVETIME], newData[DetectInfo.URGENTLEVEL], newData[DetectInfo.SETINFOID], newData[DetectInfo.SEQID] }; addRecordToStatement(infoNewUpdateStmt, params); } infoNewUpdateStmt.executeBatch(); logger.info("info_new table update success! size : "+ dataList.size()); } catch (SQLException e) { logger.error("update info to info_new table error"+e.getMessage()); } } dataList.clear(); } } private void collectWarnUpdateInfo(Object[] newDetectInfo){ Object[] params={newDetectInfo[DetectInfo.SEQID],newDetectInfo[DetectInfo.SETINFOID]}; try { addRecordToStatement(warnUpdateStmt, params); } catch (SQLException e) { e.printStackTrace(); } } }