From 63bc9328ab5abb7e7233701bbcdce61b6caa99b7 Mon Sep 17 00:00:00 2001 From: ‘liusuyi’ <1951119284@qq.com> Date: 星期六, 09 三月 2024 08:18:49 +0800 Subject: [PATCH] 优化监控雷达连接状态定时任务 --- 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 3013205..ba2c4a4 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 implements ApplicationRunner { - @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(10000); + } 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