From 8e0b2b23294ac1fdce43b9076b93e29e9aa51530 Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: 星期二, 12 三月 2024 09:37:25 +0800
Subject: [PATCH] 配置文件增加自定义tcp重连间隔时间
---
src/main/java/com/ard/utils/netty/tcp/ClientInitialize.java | 297 +++++++++++++++++++++++++++++++---------------------------
1 files changed, 158 insertions(+), 139 deletions(-)
diff --git a/src/main/java/com/ard/utils/netty/tcp/ClientInitialize.java b/src/main/java/com/ard/utils/netty/tcp/ClientInitialize.java
index cf9ef9a..db58ddb 100644
--- a/src/main/java/com/ard/utils/netty/tcp/ClientInitialize.java
+++ b/src/main/java/com/ard/utils/netty/tcp/ClientInitialize.java
@@ -1,139 +1,158 @@
-package com.ard.utils.netty.tcp;
-
-/**
- * @Description:
- * @ClassName: init
- * @Author: 鍒樿嫃涔�
- * @Date: 2023骞�07鏈�05鏃�13:11
- * @Version: 1.0
- **/
-
-import com.ard.alarm.radar.domain.ArdEquipRadar;
-import com.ard.alarm.radar.service.IArdEquipRadarService;
-import com.ard.utils.netty.config.NettyTcpConfiguration;
-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.boot.ApplicationArguments;
-import org.springframework.boot.ApplicationRunner;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
-import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CopyOnWriteArraySet;
-import java.util.function.Consumer;
-
-/**
- * 瀹㈡埛绔垵濮嬪寲
- *
- * @author lijiamin
- */
-@Component
-@Slf4j(topic = "netty")
-@Order(2)
-public class ClientInitialize {
- @Resource
- NettyTcpConfiguration nettyTcpConfig;
- @Resource
- IArdEquipRadarService ardEquipRadarService;
-
- private Bootstrap bootstrap;
- public static CopyOnWriteArraySet<ArdEquipRadar> falseConnectSet = new CopyOnWriteArraySet();
- public static ConcurrentHashMap<String, ArdEquipRadar> tureConnectMap = new ConcurrentHashMap();
- public static ConcurrentHashMap<String, Object> SuccessConnectMap = new ConcurrentHashMap();
- /**
- * Netty鍒濆鍖栭厤缃�
- */
- public void initNettyTcp() {
- EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
- bootstrap = new Bootstrap();
- bootstrap.group(eventLoopGroup)
- .channel(NioSocketChannel.class)
- .option(ChannelOption.TCP_NODELAY, true)
- .option(ChannelOption.SO_KEEPALIVE, true)
- .handler(new ChannelInitializer<SocketChannel>() {
- @Override
- protected void initChannel(SocketChannel socketChannel) {
- socketChannel.pipeline().addLast(new ClientHandler());
- }
- });
-
- // 寮傛鎸佺画鐩戝惉杩炴帴澶辫触鐨勫湴鍧�
- CompletableFuture.runAsync(new Runnable() {
- @Override
- public void run() {
- while (true) {
- try {
- if (falseConnectSet.size() != 0) {
- // 寰幆闆嗗悎鍐呭厓绱�
- falseConnectSet.forEach(new Consumer<ArdEquipRadar>() {
- @Override
- public void accept(ArdEquipRadar ardEquipRadar) {
- connectServer(ardEquipRadar);
- }
- });
- }
- Thread.sleep(10000);
- } catch (Exception e) {
- log.error("Netty鍒濆鍖栭厤缃洃鍚湴鍧�鍑虹幇寮傚父");
- e.printStackTrace();
- }
- }
- }
- });
- }
-
- /**
- * 鏈嶅姟杩炴帴
- *
- * @param ardEquipRadar
- */
- public void connectServer(ArdEquipRadar ardEquipRadar) {
- // 鑾峰彇鍦板潃鍙婄鍙�
- String host = ardEquipRadar.getIp();
- Integer port = ardEquipRadar.getPort();
- // 寮傛杩炴帴tcp鏈嶅姟绔�
- bootstrap.remoteAddress(host, port).connect().addListener((ChannelFuture futureListener) -> {
- if (!futureListener.isSuccess()) {
- log.debug("闆疯揪銆�" + host + ":" + port + "銆戣繛鎺ュけ璐�");
- futureListener.channel().close();
- // 杩炴帴澶辫触淇℃伅鎻掑叆Set
- falseConnectSet.add(ardEquipRadar);
- // 杩炴帴澶辫触淇℃伅浠巑ap绉婚櫎
- tureConnectMap.remove( host + ":" + port);
- SuccessConnectMap.remove(ardEquipRadar.getId());
- } else {
- log.debug("闆疯揪銆�" + host + ":" + port + "銆戣繛鎺ユ垚鍔�");
- // 杩炴帴鎴愬姛淇℃伅浠嶴et鎷旈櫎
- falseConnectSet.remove(ardEquipRadar);
- // 杩炴帴鎴愬姛淇℃伅鍐欏叆map
- tureConnectMap.put(host+":"+port, ardEquipRadar);
- SuccessConnectMap.put(ardEquipRadar.getId(),futureListener.channel());
- }
- });
- }
-
- /**
- * 鍒濆鍖栨柟娉�
- */
- // @Override
- public void run(ApplicationArguments args) {
- if (!nettyTcpConfig.getEnabled()) {
- return;
- }
- initNettyTcp();//鍒濆鍖杗ettyTcp
- List<ArdEquipRadar> ardEquipRadars = ardEquipRadarService.selectArdEquipRadarList(new ArdEquipRadar());
- for (ArdEquipRadar ardEquipRadar : ardEquipRadars) {
- String host = ardEquipRadar.getIp();
- Integer port = Integer.valueOf(ardEquipRadar.getPort());
- log.debug("TCP client try to connect radar銆�" + host + ":" + port+"銆�");
- connectServer(ardEquipRadar);//杩炴帴姣忎竴涓浄杈炬湇鍔�
- }
- }
-}
+package com.ard.utils.netty.tcp;
+
+import com.ard.alarm.radar.domain.ArdEquipRadar;
+import com.ard.alarm.radar.service.IArdEquipRadarService;
+import com.ard.utils.netty.config.NettyTcpConfiguration;
+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.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.core.annotation.Order;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.function.Consumer;
+
+/**
+ * 瀹㈡埛绔垵濮嬪寲
+ *
+ * @author lijiamin
+ */
+@Component
+@Slf4j(topic = "netty")
+@Order(2)
+public class ClientInitialize implements ApplicationRunner {
+ @Resource
+ NettyTcpConfiguration nettyTcpConfig;
+ @Resource
+ IArdEquipRadarService ardEquipRadarService;
+
+ private Bootstrap bootstrap;
+ public static CopyOnWriteArraySet<ArdEquipRadar> falseConnectSet = new CopyOnWriteArraySet();//澶辫触杩炴帴鐨勯浄杈維et
+ public static ConcurrentHashMap<String, ArdEquipRadar> trueConnectMap = new ConcurrentHashMap();//鎴愬姛杩炴帴鐨刬p绔彛瀵瑰簲鐨勯浄杈�
+ public static ConcurrentHashMap<String, MessageHandler> SucMessageHandlerMap = new ConcurrentHashMap();//鎴愬姛杩炴帴鐨刬p绔彛瀵瑰簲鐨勬姤鏂囪В鏋愬櫒
+ public static ConcurrentHashMap<String, Channel> SucChannelMap = new ConcurrentHashMap();//鎴愬姛杩炴帴鐨刬p绔彛瀵瑰簲鐨刵etty閫氶亾
+
+ /**
+ * Netty鍒濆鍖栭厤缃�
+ */
+ public void initNettyTcp() {
+ EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
+ bootstrap = new Bootstrap();
+ bootstrap.group(eventLoopGroup)
+ .channel(NioSocketChannel.class)
+ .option(ChannelOption.TCP_NODELAY, true)
+ .option(ChannelOption.SO_KEEPALIVE, true)
+ .handler(new ChannelInitializer<SocketChannel>() {
+ @Override
+ protected void initChannel(SocketChannel socketChannel) {
+ socketChannel.pipeline().addLast(new ClientHandler());
+ }
+ });
+
+ //寮傛鎸佺画鐩戝惉杩炴帴澶辫触鐨勫湴鍧�
+ CompletableFuture.runAsync(new Runnable() {
+ @Override
+ public void run() {
+ while (true) {
+ try {
+ if (falseConnectSet.size() != 0) {
+ // 寰幆闆嗗悎鍐呭厓绱�
+ falseConnectSet.forEach(new Consumer<ArdEquipRadar>() {
+ @Override
+ public void accept(ArdEquipRadar radar) {
+ connectServer(radar);
+ }
+ });
+ }
+ Thread.sleep(nettyTcpConfig.getReConnectInterval());
+ } catch (Exception e) {
+ log.error("Netty鍒濆鍖栭厤缃洃鍚湴鍧�鍑虹幇寮傚父");
+ e.printStackTrace();
+ }
+ }
+ }
+ });
+ }
+
+ /**
+ * 鏈嶅姟杩炴帴
+ *
+ * @param ardEquipRadar
+ */
+ public void connectServer(ArdEquipRadar ardEquipRadar) {
+ // 鑾峰彇鍦板潃鍙婄鍙�
+ String host = ardEquipRadar.getIp();
+ Integer port = ardEquipRadar.getPort();
+ String ipPort = host + ":" + port;
+ // 寮傛杩炴帴tcp鏈嶅姟绔�
+ bootstrap.remoteAddress(host, port).connect().addListener((ChannelFuture futureListener) -> {
+ if (futureListener.isSuccess()) {
+ log.debug("闆疯揪銆�" + ipPort + "銆戣繛鎺ユ垚鍔�");
+ // 杩炴帴鎴愬姛淇℃伅浠嶴et鎷旈櫎
+ falseConnectSet.remove(ardEquipRadar);
+ // 杩炴帴鎴愬姛淇℃伅鍐欏叆map
+ trueConnectMap.put(ipPort, ardEquipRadar);
+ SucMessageHandlerMap.put(ipPort, new MessageHandler());
+ SucChannelMap.put(ipPort, futureListener.channel());
+ } else {
+ log.debug("闆疯揪銆�" + ipPort + "銆戣繛鎺ュけ璐�");
+ futureListener.channel().close();
+ // 杩炴帴澶辫触淇℃伅鎻掑叆Set
+ falseConnectSet.add(ardEquipRadar);
+
+ }
+ });
+ }
+
+ /**
+ * 鍒濆鍖栨柟娉�
+ */
+ @Override
+ public void run(ApplicationArguments args) {
+ if (!nettyTcpConfig.getEnabled()) {
+ return;
+ }
+ initNettyTcp();//鍒濆鍖杗ettyTcp
+ List<ArdEquipRadar> ardEquipRadars = ardEquipRadarService.selectArdEquipRadarList(new ArdEquipRadar());
+ for (ArdEquipRadar ardEquipRadar : ardEquipRadars) {
+ String host = ardEquipRadar.getIp();
+ Integer port = Integer.valueOf(ardEquipRadar.getPort());
+ log.debug("TCP client try to connect radar銆�" + host + ":" + port + "銆�");
+ connectServer(ardEquipRadar);//杩炴帴姣忎竴涓浄杈炬湇鍔�
+ }
+ }
+
+ /**
+ * 鐩戞祴闆疯揪杩炴帴鐘舵��
+ */
+ @Scheduled(cron = "0/3 * * * * ?")
+ public void monitorConnectStatus() {
+ log.debug("瀹氭椂鐩戞祴闆疯揪杩炴帴鐘舵��");
+ List<ArdEquipRadar> ardEquipRadars = ardEquipRadarService.selectArdEquipRadarList(new ArdEquipRadar());
+ ardEquipRadars.stream().forEach(ardEquipRadar -> {
+
+ boolean online = trueConnectMap.containsKey(ardEquipRadar.getIp() + ":" + ardEquipRadar.getPort());
+ if (online) {
+ if (ardEquipRadar.getState() == null || !ardEquipRadar.getState().equals("1")) {
+ ardEquipRadar.setState("1");
+ ardEquipRadarService.updateArdEquipRadar(ardEquipRadar);
+ }
+ } else {
+ if (ardEquipRadar.getState() == null || !ardEquipRadar.getState().equals("0")) {
+ ardEquipRadar.setState("0");
+ ardEquipRadarService.updateArdEquipRadar(ardEquipRadar);
+ }
+ }
+ });
+ }
+}
--
Gitblit v1.9.3