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