This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
nms-nmsserver/src/com/nms/server/thread/detectDataHandler/DetectInfoInsertThread.java
2018-09-27 16:17:06 +08:00

1001 lines
39 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<String, List<String>> setInfoEmail = null;
// 未指定的监测设置通过seqid找到对应的联系人
Map<String, List<String>> seqIdEmail = null;
private PreparedStatement infoStmt;
private PreparedStatement warnStmt;
private PreparedStatement emailStmt;
private PreparedStatement statusChangeStmt;
private PreparedStatement infoNewInsertStmt;
private PreparedStatement infoNewUpdateStmt;
private List<Object[]> insertDataTonew;
private List<Object[]> 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<Object[]> infoQueue = Common.DETECT_QUEUE.get(DetectInfo.INFO_KEY);
if (infoQueue != null && infoQueue.size() > 0) {
conn = db.getConnection();
conn.setAutoCommit(false);
Object[] info = null;
List<Object[]> allInfo = U.newLinkedList();
List<Object[]> params = U.newLinkedList();
insertDataTonew=new ArrayList<Object[]>();
updateDataTonew=new ArrayList<Object[]>();
warnUpdateStmt=conn.prepareStatement(DetectInfo.getChangeWarningInfoSql());
int total = infoQueue.drainTo(allInfo);//一次性把队列的数据全部取出
for(int i = 0;i<total;i++){
info = allInfo.get(i);
if (info != null) {
count++;
infoSetDefaultVal(info);
params.add(info);
if (count % Constants.BATCH_RESOVE_COUNT == 0) {
judgeAndSave(params);
params.clear();
}
}
}
if(params.size() > 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<Object[]> params) {
sw.tag("s" + count);
try {
long l = System.currentTimeMillis();
sw.tag(l + "s");
//seqId,setId,list<info>
Map<String, Map<String, List<Object[]>>> orInfo = orderInfo(params);// 整理数据
Set<String> seqIds = orInfo.keySet();
// 获取 当前将要入库的数据 对应的 detection_info_new 表中的数据
Map<String, Map<String, Object[]>> detectNewData = this.getDetectNewData(seqIds);
// 判断状态变更
for (String seqId : seqIds) {//遍历即将入库的数据
Map<String, List<Object[]>> setMap = orInfo.get(seqId);
Set<Entry<String, List<Object[]>>> setEn = setMap.entrySet();
for (Entry<String, List<Object[]>> si : setEn) {
String setId = si.getKey();// 监测设置id
List<Object[]> allDeteInfo = si.getValue();// 将要入库的info数据
Object[] oldDetecInfo = null;// new表中的最新记录
// 获取 数据库 中 new 表的对应值
Map<String, Object[]> 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<Object[]>() {
@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<Object[]> infoList) throws SQLException {
Object[] temInfo = null;
try {
int infoCount = infoList.size();
int warnCount = 0;
int emailCount = 0;
Map<String,Long> statusChangeMap = U.newHashMap();
boolean emailFlag = Constants.flag_email == 1;// 是否启用 email
Iterator<Object[]> ite = infoList.iterator();
while (ite.hasNext()) {
temInfo = ite.next();
// 计算 详细表的 外键 时间戳10 + seqId5+ 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<String> 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<Entry<String,Long>> entrySet = statusChangeMap.entrySet();
for(Entry<String,Long> 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<String, List<String>> getDetecEmailListOf4() {
Map<String,List<String>> result = new HashMap<String, List<String>>();
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<Map<String, Object>> map1 = db.select(conn, sb.toString());
if(map1 != null && map1.size()>0){
List<String> tempList = null;
String email = null;
String seqId = null;
for(Map<String,Object> temp : map1){
seqId = (String)temp.get("seq_id");
email = (String)temp.get("email");
tempList = result.get(seqId);
if(tempList == null){//第一次添加
List<String> emailList = new ArrayList<String>();
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<String, List<String>> getDetecSetEmailListOf123() {
Map<String,List<String>> result = new HashMap<String, List<String>>();
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<Map<String,Object>> map1 = db.select(conn, sb.toString());
if(map1 != null && map1.size()>0){
List<String> tempList = null;
String email = null;
String id = null;
for(Map<String,Object> temp : map1){
id = (String)temp.get("id");
email = (String)temp.get("email");
tempList = result.get(id);
if(tempList == null){//第一次添加
List<String> emailList = new ArrayList<String>();
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<Object[]> 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<Object[]>() {
@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<String, Map<String, List<Object[]>>> orderInfo(List<Object[]> params) {
Map<String, Map<String, List<Object[]>>> result = U.newHashMap();
// 先将所有的数据整理成 结果集合
for (Object[] item : params) {
String seqId = (String) item[DetectInfo.SEQID];
String setId = (String) item[DetectInfo.SETINFOID];
Map<String, List<Object[]>> setMap = result.get(seqId);
if (setMap == null) {
List<Object[]> l = U.newArrayList();
l.add(item);
setMap = U.newHashMap();
setMap.put(setId, l);
result.put(seqId, setMap);
} else {
List<Object[]> 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<Entry<String, Map<String, List<Object[]>>>> seqEn = result.entrySet();
for (Entry<String, Map<String, List<Object[]>>> se : seqEn) {
Map<String, List<Object[]>> setMap = se.getValue();
Set<Entry<String, List<Object[]>>> setEn = setMap.entrySet();
for (Entry<String, List<Object[]>> st : setEn) {
List<Object[]> list = st.getValue();
if (list.size() > 1) {
// 统一seqid setid 的数据排序
Collections.sort(list, new Comparator<Object[]>() {
@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<String, Map<String, Object[]>> getDetectNewData(Collection<String> seqId) {
Map<String, Map<String, Object[]>> 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<Map<String, Object>> list = db.select(conn,sql);
if (list != null) {
for (Map<String, Object> 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<String, Object[]> 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<Object[]> 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<Object[]> allDeteInfo, Object[] oldDetecInfo,List<Object[]> 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<Object[]> 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 + seqId5+ 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 + seqId5+ 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();
}
}
}