Selaa lähdekoodia

晚上边缘端报警程序
增加全部日志打印,链路追踪

lgy 4 vuotta sitten
vanhempi
commit
913bdc7fc8

+ 9 - 0
pom.xml

@@ -133,6 +133,15 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.dadiyang</groupId>
+            <artifactId>autologging-aop</artifactId>
+            <version>1.0.0</version>
+        </dependency>
    </dependencies>
 
    <build>

+ 2 - 0
src/main/java/com/persagy/ZktProjectAlarmApplication.java

@@ -1,11 +1,13 @@
 package com.persagy;
 
+import com.github.dadiyang.autologging.aop.annotation.AutoLogAll;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
 @SpringBootApplication
 @EnableScheduling
+@AutoLogAll
 public class ZktProjectAlarmApplication {
 
     public static void main(String[] args) {

+ 1 - 1
src/main/java/com/persagy/client/GroupNettyClientHandler.java

@@ -139,7 +139,7 @@ public class GroupNettyClientHandler extends ChannelInboundHandlerAdapter {
                     alarmDefineService.deleteAlarmDefine(definesList);
                 }
             }else if (message.getOpCode() == 8) {
-                log.info("-----过期消息----[{}]",message);
+                log.info("-----报警记录id推送----[{}]",message);
                 //{"id":"","objId":"","itemCode":""}  id为报警记录ID
                 List content = message.getContent();
                 if (CollectionUtil.isNotEmpty(content)) {

+ 0 - 1
src/main/java/com/persagy/client/WebSocketClientFactory.java

@@ -109,7 +109,6 @@ public class WebSocketClientFactory {
                     }
                 }
 //                log.info("接收信息为:{}", message);
-
                 try {
                     while (!LockUtil.getInstance().isExecute()){
                         try {

+ 15 - 0
src/main/java/com/persagy/entity/ZktAlarmRecordDO.java

@@ -2,6 +2,7 @@ package com.persagy.entity;
 
 
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONField;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -11,6 +12,7 @@ import lombok.NoArgsConstructor;
 
 import javax.persistence.*;
 import java.io.Serializable;
+import java.util.Date;
 
 /**
  * 报警记录
@@ -90,6 +92,19 @@ public class ZktAlarmRecordDO implements Serializable {
     @ApiModelProperty(value = "报警名称")
     private String name;
 
+    /**
+     * 报警结束值
+     */
+    @ApiModelProperty(value = "报警结束值")
+    @JSONField(jsonDirect = true)
+    private String endInfo;
+
+    /**
+     * 有效期结束时间
+     */
+    @ApiModelProperty(value = "报警自动过期时间")
+    private Date endTime;
+
     @Override
     public String toString() {
         return JSONObject.toJSONString(this);

+ 60 - 16
src/main/java/com/persagy/job/AlarmExpireJob.java

@@ -6,10 +6,12 @@ import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.persagy.cache.AlarmInfoCache;
 import com.persagy.client.GroupNettyClient;
+import com.persagy.entity.AlarmRecord;
 import com.persagy.entity.AlarmState;
 import com.persagy.entity.NettyMessage;
 import com.persagy.entity.ZktAlarmRecordDO;
 import com.persagy.repository.AlarmRecordRepository;
+import com.persagy.utils.DateUtils;
 import com.persagy.utils.StringUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -51,6 +53,44 @@ public class AlarmExpireJob extends QuartzJobBean {
      * 报警定义标识(itemcode+objId)
      */
     private String defineId;
+
+    public String getState() {
+        return state;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    /**
+     * 报警状态(2-恢复 3-过期)
+     */
+    private String state;
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getEndInfo() {
+        return endInfo;
+    }
+
+    public void setEndInfo(String endInfo) {
+        this.endInfo = endInfo;
+    }
+
+    /**
+     * 恢复时间
+     */
+    private String endTime;
+    /**
+     * 恢复时刻信息
+     */
+    private String endInfo;
     /**
      * 集团编码
      */
@@ -69,27 +109,34 @@ public class AlarmExpireJob extends QuartzJobBean {
     protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
         try {
             JobDataMap mergedJobDataMap = context.getMergedJobDataMap();
-            log.info("----------------开始---------------------");
-            log.warn("refireCount:[{}],应该执行时间:[{}],实际执行时间:[{}]",context.getRefireCount(),expireTime,DateUtil.format(context.getFireTime(), DatePattern.ISO8601_PATTERN));
+            log.info("----------------开始---------------------{}",alarmRecord);
+            log.warn("refireCount:[{}],过期/恢复时间:[{}/{}],实际执行时间:[{}]",context.getRefireCount(),StringUtil.getString(expireTime),StringUtil.getString(endTime),DateUtil.format(context.getFireTime(), DatePattern.ISO8601_PATTERN));
             if(StringUtils.isNotBlank(alarmRecord)) {
-                ZktAlarmRecordDO zktAlarmRecordDO = StringUtil.tranferItemToDTO(this.alarmRecord, ZktAlarmRecordDO.class);
+                ZktAlarmRecordDO zktAlarmRecordDO = StringUtil.tranferItemToDTO(alarmRecord, ZktAlarmRecordDO.class);
                 //立即过期,过期的时候可能还没有报警记录ID,需要重新执行下
                 String alarmId = alarmRecordRepository.findById(zktAlarmRecordDO.getDefinitionId()).orElse(new ZktAlarmRecordDO()).getAlarmId();
                 if(StringUtil.isEmpty(alarmId)) {
-                    log.info("refire:",refire);
+                    log.info("refire:[{}]",refire);
                     mergedJobDataMap.put("refire",String.valueOf(StringUtil.getInt(refire)+1));
                     reFireJob(context,mergedJobDataMap);
+                    log.info("----------------结束---------------------");
+                    return;
                 }
-                log.info("报警参数为:",zktAlarmRecordDO.toString());
-                NettyMessage<JSONObject> nettyMessage = new NettyMessage<>();
+                log.info("报警参数为:[{}]",zktAlarmRecordDO.toString());
+                NettyMessage<AlarmRecord> nettyMessage = new NettyMessage<>();
                 nettyMessage.setStreamId(nums.getAndIncrement());
                 nettyMessage.setOpCode(6);
-                JSONObject result = new JSONObject();
-                result.put("id",zktAlarmRecordDO.getAlarmId());
-                result.put("state","3");
-                result.put("groupCode",groupCode);
-                result.put("projectId",projectId);
-                nettyMessage.setContent(Arrays.asList(result));
+                AlarmRecord message = AlarmRecord.builder()
+                        .id(alarmId)
+                        .state(StringUtil.getInt(state))
+                        .groupCode(groupCode)
+                        .projectId(projectId)
+                        .build();
+                if("2".equals(state)) {
+                    message.setEndInfo(endInfo);
+                    message.setEndTime(DateUtils.parseDate(endTime));
+                }
+                nettyMessage.setContent(Arrays.asList(message));
                 //{"id","123", "state":1, "groupCode":"wd", "projectId":"Pj123"}
                 groupNettyClient.sendMessage(nettyMessage.toString());
                 //已经过期的时候删除掉这条报警定义了,保证不会再次产生报警
@@ -109,15 +156,12 @@ public class AlarmExpireJob extends QuartzJobBean {
 
     private void reFireJob(JobExecutionContext context, JobDataMap mergedJobDataMap) {
         try {
-            log.info("refire:",refire);
             if (StringUtil.getInt(refire)>1) {
-               log.error("重新执行依然失败");
+               log.error("重新执行依然失败,信息为:{}[{}]",state,alarmRecord);
             }else {
                 Scheduler scheduler = context.getScheduler();
                 Trigger trigger = context.getTrigger();
                 DateTime dateTime = DateUtil.offsetSecond(new Date(), 300);
-                DateBuilder.IntervalUnit unit = null;
-                    // 减去一个提前发单时间
                 Trigger newTrigger = TriggerBuilder.newTrigger()
                         .startAt(dateTime.toJdkDate())
                         .withIdentity(trigger.getKey())

+ 66 - 34
src/main/java/com/persagy/service/impl/AlarmHandleServiceImpl.java

@@ -1,6 +1,7 @@
 package com.persagy.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Maps;
 import com.googlecode.aviator.AviatorEvaluator;
@@ -16,6 +17,7 @@ import com.persagy.service.AlarmQuartzService;
 import com.persagy.utils.DateUtils;
 import com.persagy.utils.StringUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.quartz.JobDataMap;
 import org.quartz.SchedulerException;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -82,10 +84,6 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
         }
         //返回的信息点个数
         int nums = (split.length) / 4;
-        if(log.isDebugEnabled()){
-            log.debug("接收信息length:[{}]数据为:{}", nums,msg);
-        }
-        System.out.println(nums);
         for (int i = 0; i < nums; i++) {
             String dateTime = split[i * 4];
             String meterId = split[i * 4 + 1];
@@ -133,7 +131,7 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
                             log.info("--"+alarmDefine.toString());
                             log.info("--"+JSONObject.toJSONString(paramMap));
                             //当前数据正常
-                            handlerNowDataNormal(alarmDefine, dateTime, condition, defineId, endResult, alarmState);
+                            handlerNowDataNormal(alarmDefine, dateTime, condition, defineId, endResult, alarmState,paramMap);
                         }
                     } else {
                         log.warn("部分信息点没有数值:[{}]", codeDetail);
@@ -145,12 +143,13 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
     }
 
     /**
-     * @param alarmDefine:       报警定义
-     * @param dateTime:IOT采集时间
-     * @param condition:报警条件
-     * @param defineId:报警定义ID
-     * @param endResult:报警恢复监测结果
-     * @param alarmState:        报警状态时间实体
+     * @param alarmDefine :       报警定义
+     * @param dateTime :IOT采集时间
+     * @param condition :报警条件
+     * @param defineId :报警定义ID
+     * @param endResult :报警恢复监测结果
+     * @param alarmState :        报警状态时间实体
+     * @param paramMap   报警恢复触发值
      * @description:当前数据正常判断逻辑
      * @exception:
      * @author: LuoGuangyi
@@ -159,7 +158,7 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
      * @since: 2020/10/21 16:46
      * @version: V1.0
      */
-    private void handlerNowDataNormal(AlarmDefine alarmDefine, String dateTime, Condition condition, String defineId, Boolean endResult, AlarmState alarmState) throws InterruptedException {
+    private void handlerNowDataNormal(AlarmDefine alarmDefine, String dateTime, Condition condition, String defineId, Boolean endResult, AlarmState alarmState, HashMap paramMap) throws InterruptedException {
         //当前数据正常,报警状态为正常:清空之前的报警计时,重置回默认状态
         if (AlarmState.State.NORMAL.getType().equals(alarmState.getState())) {
             alarmState = new AlarmState(defineId);
@@ -178,33 +177,64 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
                 int uphold = condition.getEndUphold();
                 //超过报警恢复设置的持续时间
                 if (DateUtils.betweenTwoTimeSecond(endTime, dateTime) >= uphold) {
-                    log.error("产生一条报警恢复消息");
-                    NettyMessage<JSONObject> nettyMessage = new NettyMessage<>();
+                    log.error("产生一条报警恢复消息[{}]>[{}]",DateUtils.betweenTwoTimeSecond(endTime, dateTime),uphold);
+                    NettyMessage<AlarmRecord> nettyMessage = new NettyMessage<>();
                     nettyMessage.setOpCode(6);
-                    JSONObject result = new JSONObject();
-                    Optional<ZktAlarmRecordDO> alarmRecordDO = alarmRecordRepository.findById(AlarmInfoCache.getAlarmDefineId(alarmDefine));
-                    if (alarmRecordDO.isPresent()){
-                        result.put("id", alarmRecordDO.get().getAlarmId());
-                        result.put("state", "2");
-                        result.put("groupCode", groupCode);
-                        result.put("projectId", projectId);
-                        nettyMessage.setContent(Arrays.asList(result));
-                        //{"id","123", "state":1, "groupCode":"wd", "projectId":"Pj123"}
+                    ZktAlarmRecordDO alarmRecordDO = alarmRecordRepository.findById(AlarmInfoCache.getAlarmDefineId(alarmDefine)).orElse(new ZktAlarmRecordDO());
+                    alarmRecordDO.setDefinitionId(defineId);
+                    alarmRecordDO.setObjId(alarmDefine.getObjId());
+                    alarmRecordDO.setItemCode(alarmDefine.getItemCode());
+                    alarmRecordDO.setState("2");
+                    alarmRecordDO.setEndTime(DateUtils.parseDate(dateTime));
+                    alarmRecordDO.setEndInfo(JSONObject.toJSONString(paramMap));
+                    //更新报警状态
+                    alarmRecordRepository.save(alarmRecordDO);
+                    String alarmId = alarmRecordDO.getAlarmId();
+                    //报警恢复参数
+                    AlarmRecord alarmResumeRecord = AlarmRecord.builder()
+                            .state(2)
+                            .groupCode(groupCode)
+                            .projectId(projectId)
+                            .endTime(DateUtils.parseDate(dateTime))
+                            .endInfo(JSONObject.toJSONString(paramMap))
+                            .build();
+                    //如果有报警ID,直接报警恢复
+                    if(StringUtils.isNotEmpty(alarmId)) {
+                        alarmResumeRecord.setId(alarmId);
+                        nettyMessage.setContent(Arrays.asList(alarmResumeRecord));
+                        //{"id","123", "state":1, "groupCode":"wd", "projectId":"Pj123","endTime":"","endInfo":""}
                         groupNettyClient.sendMessage(nettyMessage.toString());
-                        log.error("产生一条取消报警过期定时任务的消息");
-                        String jobName = AlarmInfoCache.getAlarmDefineId(alarmDefine);
+                    }else {
+                        //如果没有报警ID,定时任务再次测试
+                        JobDataMap jobDataMap = new JobDataMap();
+                        jobDataMap.put("alarmRecord", alarmRecordDO.toString());
+                        jobDataMap.put("refire", "0");
+                        jobDataMap.put("endTime", dateTime);
+                        jobDataMap.put("endInfo", JSONObject.toJSONString(paramMap));
+                        jobDataMap.put("defineId", defineId);
+                        //恢复
+                        jobDataMap.put("state", "2");
+                        log.info(JSONObject.toJSONString(jobDataMap));
+                        String jobName = defineId;
                         ExpireAlarmMessage em = new ExpireAlarmMessage();
-                        //取消过期消息
-                        em.setType("2");
+                        //过期消息
+                        em.setType("1");
+                        em.setStartTime(DateUtil.offsetMinute(new Date(),3).toJdkDate());
+                        em.setJobDataMap(jobDataMap);
                         em.setJobName(jobName);
-                        em.setJobGroupName("expire");
+                        em.setJobGroupName("resume");
                         ExpireAlarmQueue.getExpireAlarmMessageQueue().produce(em);
-                        //报警恢复,报警状态重置回默认
-                        alarmState.reset();
-                    }else {
-                        log.warn("找不到该条报警状态的信息,可能是该条报警已经屏蔽");
-
                     }
+
+                    String jobName = AlarmInfoCache.getAlarmDefineId(alarmDefine);
+                    ExpireAlarmMessage em = new ExpireAlarmMessage();
+                    //取消过期消息
+                    em.setType("2");
+                    em.setJobName(jobName);
+                    em.setJobGroupName("expire");
+                    ExpireAlarmQueue.getExpireAlarmMessageQueue().produce(em);
+                    //报警恢复,报警状态重置回默认
+                    alarmState.reset();
                 }
             }
             alarmInfoCache.setAlarmState(defineId, alarmState);
@@ -272,7 +302,7 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
                 }
 
                 if (timeSecond >= condition.getTriggerUphold()) {
-                    log.error("大于持续时间了,产生一条报警");
+                    log.warn("大于持续时间了,产生一条报警[{}]>[{}]",timeSecond,condition.getTriggerUphold());
                     AlarmRecord alarmRecord = AlarmRecord.builder()
                             .category(alarmDefine.getCategory())
                             .concern(alarmDefine.getConcern())
@@ -322,6 +352,8 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
                         jobDataMap.put("refire", "0");
                         jobDataMap.put("expireTime", DateUtils.format(expireDateTime));
                         jobDataMap.put("defineId", defineId);
+                        //过期
+                        jobDataMap.put("state", "3");
                         String jobName = defineId;
                         ExpireAlarmMessage em = new ExpireAlarmMessage();
                         //过期消息

+ 0 - 95
src/main/java/com/persagy/utils/ItvJsonUtil.java

@@ -1,95 +0,0 @@
-package com.persagy.utils;
-
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-
-
-public class ItvJsonUtil {
-    private static final Logger logger = LoggerFactory.getLogger(ItvJsonUtil.class);
-
-    public static ObjectMapper mapper = new ObjectMapper();
-
-    // 序列化时null字段不输出
-    static {
-        mapper.setDefaultPropertyInclusion(Include.NON_NULL);
-    }
-
-    /**
-     * 将json字符串反序列号成对象
-     *
-     * @param <T>
-     * @param json
-     * @param clazz
-     * @return
-     */
-    public static <T> T readValue(String json, Class<T> clazz) {
-        try {
-            return mapper.readValue(json, clazz);
-        } catch (JsonParseException e) {
-            logger.error("readValue exception", e);
-            // e.printStackTrace();
-        } catch (JsonMappingException e) {
-            logger.error("readValue exception", e);
-            // e.printStackTrace();
-        } catch (IOException e) {
-            logger.error("readValue exception", e);
-            // e.printStackTrace();
-        }
-
-        return null;
-    }
-
-    /**
-     * @param json
-     * @param valueTypeRef
-     * @return
-     * @Title: readValue
-     * @return: T
-     */
-    public static <T> T readValue(String json, TypeReference<T> valueTypeRef) {
-        try {
-            return mapper.readValue(json, valueTypeRef);
-        } catch (JsonParseException e) {
-            logger.error("readValue exception", e);
-            // e.printStackTrace();
-        } catch (JsonMappingException e) {
-            logger.error("readValue exception", e);
-            // e.printStackTrace();
-        } catch (IOException e) {
-            logger.error("readValue exception", e);
-            // e.printStackTrace();
-        }
-
-        return null;
-    }
-
-    /**
-     * 将对象序列号json字符串
-     *
-     * @param obj
-     * @return
-     */
-    public static String writeValue(Object obj) {
-        try {
-            return mapper.writeValueAsString(obj);
-        } catch (JsonParseException e) {
-            logger.error("writeValue exception", e);
-            // e.printStackTrace();
-        } catch (JsonMappingException e) {
-            logger.error("writeValue exception", e);
-            // e.printStackTrace();
-        } catch (IOException e) {
-            logger.error("writeValue exception", e);
-            // e.printStackTrace();
-        }
-
-        return null;
-    }
-}

+ 33 - 3
src/main/resources/application.yml

@@ -37,9 +37,9 @@ spring:
     hibernate:
       ddl-auto: none
 group:
-  code: wd   #标识哪个接团 比如万达使用wd
+  code: WD   #标识哪个接团 比如万达使用WD
   alarm:
-    host: 127.0.0.1 #39.102.43.179     #netty IP 127.0.0.1
+    host: 39.102.43.179 #39.102.43.179     #netty IP
     port: 9986          #netty 端口9986
 terminal:  #边缘端IOT采集程序地址
   alarm:  # 拼接后的地址为ws://host:port/suffix
@@ -56,4 +56,34 @@ alarm:
   get:
     all:
       alarmdefine:
-        cron: 0 0 23 * * ?   #每天23点全量更新一次报警定义
+        cron: 0 0 23 * * ?   #每天23点全量更新一次报警定义
+# 配置日志相关的参考文档,https://github.com/dadiyang/autologging.git
+autolog:
+  # 请填写应用名称,必填!
+  app-name: ${spring.application.name}
+  # 是否读取远程配置,开启此配置将可以支持远程动态更改配置
+  use-remote: false
+  # 如果启用远程配置,必须配置远程服务器地址
+  remote-config-host: ''
+  # 耗时阈值,只有当方法耗时大于这个值时才处理,单位毫秒,默认不限制
+  time-consume-threshold: -1
+  # 是否打印日志到本地
+  local:
+    enable: true
+    # 本地打印耗时阈值,只有当方法耗时大于这个值时打印到本地,单位毫秒,默认不限制
+    time-consume-threshold: -1
+  # 选择开启哪些切面
+  aspect-enable:
+    controller: true
+    http-api: true
+    log: true
+    mapper: true
+    repository: true
+    service: true
+    service-contract: true
+  # 关于参数和返回值序列化的配置
+  serialize:
+    args-full: true
+    args-max-length: 512
+    result-full: false
+    result-max-length: 512

+ 2 - 1
src/main/resources/logback-spring.xml

@@ -20,7 +20,7 @@ configuration 子节点为 appender、logger、root       -->
     %n:输出一个换行符号
 -->
     <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
-    <property name="pattern" value="%d{yyyy-MM-dd:HH:mm:ss.SSS} [%thread] %-5level  %msg%n"/>
+    <property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS}  %-5level [%thread] %msg%n"/>
 
     <!--控制台-->
     <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
@@ -45,6 +45,7 @@ configuration 子节点为 appender、logger、root       -->
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                 <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
+            <!--查看   gunzip -c xx.log.gz | less-->
             <fileNamePattern>${LOG_HOME}/log.%d{yyyy-MM-dd}.log.%i.gz</fileNamePattern>
             <maxHistory>30</maxHistory><!--保存最近30天的日志-->
         </rollingPolicy>