Browse Source

报警定义消息整合后,一次发送给边缘端

lixing 4 years ago
parent
commit
012e550ee7

+ 33 - 7
src/main/java/com/persagy/dmp/starter/alarm/communication/netty/NettyAlarmMsgBaseHandler.java

@@ -18,10 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 
 import java.net.SocketAddress;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
@@ -142,10 +139,24 @@ public class NettyAlarmMsgBaseHandler extends ChannelInboundHandlerAdapter {
                         ((JSONObject) alarmConfig).getString("projectId")
                 )
         );
+
+        // 全量同步报警定义,同一个边缘端只能发送一条消息,如果有多条,只有最后一条生效。
+        // 因此这里需要先将需要给边缘端发送的消息整理在一起
+        Map<Channel, List<Object>> channelGroups = new HashMap<>();
+
         groups.forEach((tmpProjectId, alarmConfigList) -> {
-            sendMessage(tmpProjectId, new NettyAlarmMessage(9, alarmConfigList).toString());
+            Channel channel = getChannel(projectId);
+            if (channelGroups.containsKey(channel)) {
+                // 把要发送的报警定义追加到通道中
+                channelGroups.get(channel).addAll(alarmConfigList);
+            } else {
+                channelGroups.put(channel, alarmConfigList);
+            }
         });
 
+        channelGroups.forEach((channel, alarmConfigList) -> {
+            sendMessage(channel, new NettyAlarmMessage(9, alarmConfigList).toString());
+        });
     }
 
     /**
@@ -351,11 +362,26 @@ public class NettyAlarmMsgBaseHandler extends ChannelInboundHandlerAdapter {
      */
     public void sendMessage(String projectId, String msg) {
         Channel channel = getChannel(projectId);
+        log.info("projectId: {}", projectId);
+        sendMessage(channel, msg);
+    }
+
+    /**
+     * @description: 发送消息
+     * @param: channel 通道
+     * @param: msg 消息
+     * @return: void
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/12/17 12:55 下午
+     * @version: V1.0
+     */
+    public void sendMessage(Channel channel, String msg) {
         if (channel != null) {
             channel.writeAndFlush(msg);
         } else {
-            log.info("...projectId[{}]未建立连接,无法发送!", projectId);
+            log.error("消息通道未建立,无法发送消息!");
         }
-
     }
 }

+ 13 - 0
src/main/java/com/persagy/dmp/starter/alarm/service/NettyAlarmService.java

@@ -130,6 +130,18 @@ public abstract class NettyAlarmService extends BaseService{
     public abstract String getAlarmSupplement(String objId);
 
     /**
+     * @description: 获取报警等级
+     * @param: JSONObject 创建报警的参数
+     * @return: java.lang.String
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2020/11/30 4:00 下午
+     * @version: V1.0
+     */
+    public abstract String getAlarmLevel(JSONObject data);
+
+    /**
      * @description: 获取报警备注
      * @param: objId
      * @return: java.lang.String
@@ -162,6 +174,7 @@ public abstract class NettyAlarmService extends BaseService{
         data.put("name", getAlarmName(objId));
         data.put("remark", getAlarmRemark(getAlarmUrlParam(data),objId,itemCode));
         data.put("supplement", getAlarmSupplement(objId));
+        data.put("level", getAlarmLevel(data));
 
         DmpResult<JSONObject> alarmRecord = alarmClient.createAlarmRecord(getAlarmUrlParam(data), data);
         return alarmRecord.getData().getString("id");