From 0819312988ae6e041360fd354ef57a73633b7354 Mon Sep 17 00:00:00 2001
From: zhangnaisong <2434969829@qq.com>
Date: 星期六, 07 九月 2024 16:16:12 +0800
Subject: [PATCH] 二厂数字化工况预警与停机报警提交

---
 src/main/java/com/ard/utils/netty/tcp/RadarNettyTcpClient.java |  251 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 251 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ard/utils/netty/tcp/RadarNettyTcpClient.java b/src/main/java/com/ard/utils/netty/tcp/RadarNettyTcpClient.java
new file mode 100644
index 0000000..3093c1e
--- /dev/null
+++ b/src/main/java/com/ard/utils/netty/tcp/RadarNettyTcpClient.java
@@ -0,0 +1,251 @@
+package com.ard.utils.netty.tcp;
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import com.ard.alarm.radar.domain.ArdEquipRadar;
+import com.ard.alarm.radar.service.IArdEquipRadarService;
+import com.ard.utils.netty.tcp.handler.*;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 瀹㈡埛绔垵濮嬪寲
+ *
+ * @author lijiamin
+ */
+@Component
+@Slf4j(topic = "netty")
+public class RadarNettyTcpClient {
+
+    @Resource
+    IArdEquipRadarService ardEquipRadarService;
+
+    @Autowired
+    @Qualifier("exec")
+    ThreadPoolTaskExecutor executorService;
+
+    EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
+
+    public static ConcurrentHashMap<String, MessageHandler> SucMessageHandlerMap = new ConcurrentHashMap();//鎴愬姛杩炴帴鐨刬p绔彛瀵瑰簲鐨勬姤鏂囪В鏋愬櫒
+    public static ConcurrentHashMap<String, Integer> aroundScanfMap = new ConcurrentHashMap();//鏄惁鍚姩鍛ㄨ
+    public static final Map<String, Channel> SERVER_MAP = new ConcurrentHashMap();
+    public static final Map<String, ArdEquipRadar> RADAR_MAP = new ConcurrentHashMap();
+
+    /**
+     * 鍒濆鍖栨柟娉�
+     */
+    public void initAllChannel(List<Map<String, Object>> portHosts) {
+        for (Map<String, Object> map : portHosts) {
+            String host = (String) map.get("IP");
+            Integer port = (Integer) map.get("PORT");
+            try {
+                connectServer(host, port);
+            } catch (Exception ex) {
+                log.error(ex.getMessage());
+            }
+        }
+    }
+
+    /**
+     * 鍒濆鍖朆ootstrap
+     * 鍒樿嫃涔�
+     * 2024/3/25 9:53:57
+     */
+    public Bootstrap getBootstrap(EventLoopGroup group) {
+        if (null == group) {
+            group = eventLoopGroup;
+        }
+        Bootstrap bootstrap = new Bootstrap();
+        bootstrap.group(group)
+                .channel(NioSocketChannel.class)
+                .option(ChannelOption.TCP_NODELAY, true)
+                .option(ChannelOption.SO_KEEPALIVE, true)
+                .handler(new ChannelInitializer<SocketChannel>() {
+                    @Override
+                    protected void initChannel(SocketChannel socketChannel) throws Exception {
+                        ChannelPipeline pipeline = socketChannel.pipeline();
+                        pipeline.addLast("handler", new ClientHandler());
+                    }
+                });
+        return bootstrap;
+    }
+
+    /**
+     * 鏈嶅姟杩炴帴
+     * 鍒樿嫃涔�
+     * 2024/3/25 9:52:28
+     */
+    public void connectServer(String host, Integer port) {
+        try {
+            //寮傛杩炴帴tcp鏈嶅姟绔�
+            Bootstrap bootstrap = getBootstrap(null);
+            bootstrap.remoteAddress(host, port);
+            ChannelFuture channelFuture = bootstrap.connect().sync();
+            if (channelFuture.isSuccess()) {
+                log.info("闆疯揪銆�" + host + ":" + port + "銆戣繛鎺ユ垚鍔�");
+                String serverKey = String.format("%s:%d", host, port);
+                SERVER_MAP.put(serverKey, channelFuture.channel());
+                SucMessageHandlerMap.put(serverKey, new MessageHandler());
+            }
+            channelFuture.channel().closeFuture().addListener(new ChannelFutureListener() {
+                public void operationComplete(ChannelFuture future) throws Exception {
+                    String serverKey = String.format("%s:%d", host, port);
+                    SERVER_MAP.remove(serverKey);
+                    //鏈嶅姟绔绾匡紝瑙﹀彂閲嶈繛鎿嶄綔
+                    reconnect(host, port);
+                }
+            });
+        } catch (Exception e) {
+            reconnect(host, port);
+            throw new RuntimeException("闆疯揪銆�" + host + ":" + port + "銆戣繛鎺ュ紓甯�:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 閲嶈繛鏈嶅姟绔�
+     * 鍒樿嫃涔�
+     * 2024/3/25 9:52:15
+     */
+    public void reconnect(final String host, final int port) {
+        log.debug("闆疯揪銆�" + host + ":" + port + "銆戣繛鎺ュけ璐ワ紝杩涜閲嶈繛...");
+        executorService.submit(new Runnable() {
+            public void run() {
+                for (; ; ) {
+                    try {
+                        TimeUnit.SECONDS.sleep(3);
+                        connectServer(host, port);
+                        if (SERVER_MAP.containsKey(String.format("%s:%d", host, port))) {
+                            break;
+                        }
+                    } catch (Exception e) {
+                        log.error(e.getMessage());
+                        break;
+                    }
+                }
+            }
+        });
+    }
+
+    /**
+     * 鐩戞祴闆疯揪杩炴帴鐘舵��
+     */
+//    @Scheduled(cron = "0/5 * * * * ?")
+    public void monitorConnectStatus1() {
+        try {
+            log.debug("瀹炴椂鐩戞祴闆疯揪杩炴帴鐘舵��...");
+            List<ArdEquipRadar> ardEquipRadars = ardEquipRadarService.selectArdEquipRadarList(new ArdEquipRadar());
+            ardEquipRadars.stream().forEach(ardEquipRadar -> {
+                //鍒ゆ柇涓庨浄杈惧鎴风杩炴帴鐘舵��
+                boolean online = SERVER_MAP.containsKey(ardEquipRadar.getIp() + ":" + ardEquipRadar.getPort());
+                if (online) {
+                    //杩炴帴闆疯揪瀹㈡埛绔垚鍔� 鍒ゆ柇鍛ㄦ壂鐘舵��
+                    if (aroundScanfMap.containsKey(ardEquipRadar.getIp() + ":" + ardEquipRadar.getPort())) {
+                        Integer state = aroundScanfMap.get(ardEquipRadar.getIp() + ":" + ardEquipRadar.getPort());
+                        if (state == 1) {//1-鍛ㄦ壂鎵撳紑-杩炴帴鎴愬姛
+                            if (ardEquipRadar.getState() == null || !ardEquipRadar.getState().equals("1")) {
+                                ardEquipRadar.setState("1");
+                                ardEquipRadarService.updateArdEquipRadar(ardEquipRadar);
+                            }
+                        } else {
+                            if (ardEquipRadar.getState() == null || !ardEquipRadar.getState().equals("2")) {
+                                //2-鍛ㄦ壂鏈紑
+                                ardEquipRadar.setState("2");
+                                ardEquipRadarService.updateArdEquipRadar(ardEquipRadar);
+                            }
+
+                        }
+                    } else {
+                        if (ardEquipRadar.getState() == null || !ardEquipRadar.getState().equals("2")) {
+                            //2-鍛ㄦ壂鏈紑
+                            ardEquipRadar.setState("2");
+                            ardEquipRadarService.updateArdEquipRadar(ardEquipRadar);
+                        }
+                    }
+                } else {
+                    //杩炴帴闆疯揪瀹㈡埛绔け璐�
+                    if (ardEquipRadar.getState() == null || !ardEquipRadar.getState().equals("0")) {
+                        //0-瀹㈡埛绔笉閫�
+                        ardEquipRadar.setState("0");
+                        ardEquipRadarService.updateArdEquipRadar(ardEquipRadar);
+                    }
+                }
+            });
+        } catch (Exception e) {
+            log.error("瀹氭椂鐩戞祴闆疯揪杩炴帴鐘舵�佸紓甯�:" + e.getMessage());
+        }
+    }
+
+
+    @PostConstruct
+    public void monitorConnectStatus() {
+        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
+        Runnable task = () -> {
+            try {
+                // 瀹氭椂浠诲姟鐨勯�昏緫
+                log.debug("瀹炴椂鐩戞祴闆疯揪杩炴帴鐘舵��...");
+                List<ArdEquipRadar> ardEquipRadars = ardEquipRadarService.selectArdEquipRadarList(new ArdEquipRadar());
+                ardEquipRadars.stream().forEach(ardEquipRadar -> {
+                    // 鍒ゆ柇涓庨浄杈惧鎴风杩炴帴鐘舵��
+                    boolean online = SERVER_MAP.containsKey(ardEquipRadar.getIp() + ":" + ardEquipRadar.getPort());
+                    if (online) {
+                        log.debug("闆疯揪銆�" + ardEquipRadar.getIp() + ":" + ardEquipRadar.getPort() + "銆戠姸鎬侊細鍦ㄧ嚎");
+                        // 杩炴帴闆疯揪瀹㈡埛绔垚鍔� 鍒ゆ柇鍛ㄦ壂鐘舵��
+                        if (aroundScanfMap.containsKey(ardEquipRadar.getIp() + ":" + ardEquipRadar.getPort())) {
+                            Integer state = aroundScanfMap.get(ardEquipRadar.getIp() + ":" + ardEquipRadar.getPort());
+                            log.debug("闆疯揪銆�" + ardEquipRadar.getIp() + ":" + ardEquipRadar.getPort() + "銆戣幏鍙栧埌鍛ㄦ壂鐘舵�侊細" + state);
+                            if (state == 1) { // 1-鍛ㄦ壂鎵撳紑-杩炴帴鎴愬姛
+                                log.debug("闆疯揪銆�" + ardEquipRadar.getIp() + ":" + ardEquipRadar.getPort() + "銆戝懆鎵姸鎬佸紑");
+                                if (ardEquipRadar.getState() == null || !ardEquipRadar.getState().equals("1")) {
+                                    ardEquipRadar.setState("1");
+                                    ardEquipRadarService.updateArdEquipRadar(ardEquipRadar);
+                                }
+                            } else {
+                                log.debug("闆疯揪銆�" + ardEquipRadar.getIp() + ":" + ardEquipRadar.getPort() + "銆戝懆鎵姸鎬佸叧");
+                                if (ardEquipRadar.getState() == null || !ardEquipRadar.getState().equals("2")) {
+                                    // 2-鍛ㄦ壂鏈紑
+                                    ardEquipRadar.setState("2");
+                                    ardEquipRadarService.updateArdEquipRadar(ardEquipRadar);
+                                }
+                            }
+                        } else {
+                            log.debug("闆疯揪銆�" + ardEquipRadar.getIp() + ":" + ardEquipRadar.getPort() + "銆戞湭鑾峰彇鍒板懆鎵姸鎬�");
+                            if (ardEquipRadar.getState() == null || !ardEquipRadar.getState().equals("2")) {
+                                // 2-鍛ㄦ壂鏈紑
+                                ardEquipRadar.setState("2");
+                                ardEquipRadarService.updateArdEquipRadar(ardEquipRadar);
+                            }
+                        }
+                    } else {
+                        log.debug("闆疯揪銆�" + ardEquipRadar.getIp() + ":" + ardEquipRadar.getPort() + "銆戠姸鎬侊細绂荤嚎");
+                        // 杩炴帴闆疯揪瀹㈡埛绔け璐�
+                        if (ardEquipRadar.getState() == null || !ardEquipRadar.getState().equals("0")) {
+                            // 0-瀹㈡埛绔笉閫�
+                            ardEquipRadar.setState("0");
+                            ardEquipRadarService.updateArdEquipRadar(ardEquipRadar);
+                        }
+                    }
+                });
+            } catch (Exception e) {
+                log.error("瀹氭椂鐩戞祴闆疯揪杩炴帴鐘舵�佸紓甯�:" + e.getMessage());
+            }
+        };
+
+        scheduler.scheduleAtFixedRate(task, 0, 5, TimeUnit.SECONDS);
+    }
+}

--
Gitblit v1.9.3