From 97777b835192d6f0fedc8fec397fa52a382328cc Mon Sep 17 00:00:00 2001 From: liurunyu <lry9898@163.com> Date: 星期二, 25 三月 2025 10:18:17 +0800 Subject: [PATCH] 调整application.yml配置文件的结构,以支持多服务器多子系统的方便配置切换 --- pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpSessionCache.java | 196 ++++++++++++++++++++++++++++++------------------ 1 files changed, 121 insertions(+), 75 deletions(-) diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpSessionCache.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpSessionCache.java index 8d37adf..144593d 100644 --- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpSessionCache.java +++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpSessionCache.java @@ -1,13 +1,9 @@ package com.dy.rtuMw.server.forTcp; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; +import java.util.*; import java.util.Map.Entry; +import com.dy.common.mw.channel.tcp.TcpIoSessionAttrIdIsRtuAddr; import org.apache.mina.core.session.IoSession; import com.dy.rtuMw.server.ServerProperties; @@ -24,22 +20,59 @@ * * 2023-12-19瀹炴祴锛屽彂鐜癏ashtable骞朵笉绾跨▼瀹夊叏锛屾墍浠ュ簲鐢ㄤ簡HashMap鍜宻ynchronized */ - private static HashMap<String, TcpSession> sessionTable = new HashMap<String, TcpSession>() ; - + private static HashMap<String, TcpSession> map = new HashMap<String, TcpSession>() ; + + + /** + * 寰楀埌淇℃伅 + * @return + */ + public static Integer[] info(){ + Integer rtuTotalConnect = 0 ;//宸茬粡杩炴帴杩囦腑闂翠欢鐨凴TU鎬绘暟锛堝寘鎷湪绾夸笌绂荤嚎鐨勶級 + Integer rtuTotalOnLine = 0 ;//鍦ㄧ嚎RTU鎬绘暟 + Integer rtuTotalOffLine = 0 ;//绂荤嚎RTU鎬绘暟 + synchronized (map){ + rtuTotalConnect = map.size() ; + Collection<TcpSession> col = map.values() ; + for(TcpSession se : col){ + if(se.ioSession.isConnected()){ + rtuTotalOnLine ++ ; + }else{ + rtuTotalOffLine ++ ; + } + } + } + return new Integer[] {rtuTotalConnect, rtuTotalOnLine, rtuTotalOffLine} ; + } + + /** + * 鍏抽棴鎵�鏈夌綉缁滆繛鎺� + */ + public static void closeAllSessions(){ + synchronized (map){ + Collection<TcpSession> col = map.values() ; + for(TcpSession se : col){ + se.ioSession.closeNow() ; + } + map.clear(); + } + } + /** * 鍔犲叆鏂扮殑IoSession * @param rtuAddr - * @param protocolName * @param ioSession */ - public static void putNewTcpSession(String rtuAddr, String protocolName, IoSession ioSession){ - synchronized (sessionTable){ - TcpSession tcpSe = sessionTable.get(rtuAddr) ; + //public static void putNewTcpSession(String rtuAddr, String protocolName, Short protocolVersion, IoSession ioSession){ + public static void putNewTcpSession(String rtuAddr, IoSession ioSession){ + synchronized (map){ + TcpSession tcpSe = map.get(rtuAddr) ; if(tcpSe == null){ tcpSe = new TcpSession() ; - tcpSe.protocolName = protocolName ; + //tcpSe.protocolName = protocolName ; + //tcpSe.protocolVersion = protocolVersion ; tcpSe.ioSession = ioSession ; - sessionTable.put(rtuAddr, tcpSe) ; + map.put(rtuAddr, tcpSe) ; }else{ tcpSe.ioSession = ioSession ; } @@ -50,18 +83,18 @@ * 鏇存柊IoSession瀵瑰簲鐨剅tuAddr * @param oldRtuAddr * @param newRtuAddr - * @param protocolName * @param ioSession */ - public static void changeRtuAddr(String oldRtuAddr, String newRtuAddr, String protocolName, IoSession ioSession){ + //public static void changeRtuAddr(String oldRtuAddr, String newRtuAddr, String protocolName, Short protocolVersion, IoSession ioSession){ + public static void changeRtuAddr(String oldRtuAddr, String newRtuAddr, IoSession ioSession){ if(oldRtuAddr != null && newRtuAddr != null && !oldRtuAddr.equals(newRtuAddr)){ - synchronized (sessionTable){ - TcpSession tcpSe = sessionTable.get(oldRtuAddr) ; + synchronized (map){ + TcpSession tcpSe = map.get(oldRtuAddr) ; if(tcpSe == null){ - putNewTcpSession(newRtuAddr, protocolName, ioSession) ; + putNewTcpSession(newRtuAddr, ioSession) ; }else{ - sessionTable.remove(oldRtuAddr) ; - sessionTable.put(newRtuAddr, tcpSe) ; + map.remove(oldRtuAddr) ; + map.put(newRtuAddr, tcpSe) ; } } } @@ -73,20 +106,44 @@ * @return */ public static TcpSession getTcpSession(String rtuAddr){ - return sessionTable.get(rtuAddr) ; + return map.get(rtuAddr) ; } - + /** * 寰楀埌Tcp閫氫俊鍗忚鍚嶇О * @param rtuAddr * @return - */ - public static String getTcpProtocolName(String rtuAddr){ - TcpSession tcpSe = sessionTable.get(rtuAddr) ; + * */ + public static Object[] getTcpProtocolNameVersion(String rtuAddr){ + TcpSession tcpSe = map.get(rtuAddr) ; if(tcpSe != null){ - return tcpSe.protocolName ; + return new Object[]{ + tcpSe.ioSession.getAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrProtocolName), + tcpSe.ioSession.getAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrProtocolVersion)}; }else{ return null ; + } + } + + + /** + * 寰楀埌鎵�鏈夊湪绾夸笌绂荤嚎鏁伴噺缁熻 + * @return [0]=鍦ㄧ嚎鏁伴噺锛孾1]涓婄嚎杩囷紝浣嗗綋鍓嶇绾跨殑鏁伴噺 + */ + public static Integer[] allOnLineStateStatistics(){ + synchronized (map){ + Integer[] arr = new Integer[]{0, 0} ; + Iterator<Entry<String, TcpSession>> it = map.entrySet().iterator() ; + Entry<String, TcpSession> entry = null ; + while(it.hasNext()){ + entry = it.next() ; + if(entry.getValue().ioSession.isConnected()){ + arr[0]++ ; + }else{ + arr[1]++ ; + } + } + return arr ; } } @@ -95,9 +152,9 @@ * @return */ public static HashMap<String, Boolean> allOnLine(){ - synchronized (sessionTable){ + synchronized (map){ HashMap<String, Boolean> map = new HashMap<String, Boolean>(); - Iterator<Entry<String, TcpSession>> it = sessionTable.entrySet().iterator() ; + Iterator<Entry<String, TcpSession>> it = TcpSessionCache.map.entrySet().iterator() ; Entry<String, TcpSession> entry = null ; while(it.hasNext()){ entry = it.next() ; @@ -106,56 +163,32 @@ return map ; } } + + /** - * 寰楀埌鎵�鏈塕TU杩炴帴鐘舵�佹儏鍐� + * 寰楀埌閮ㄥ垎鍦ㄧ嚎鎯呭喌 * @return */ - public static List<RtuSessionStatus> allConnectStatus(){ - synchronized (sessionTable){ - List<RtuSessionStatus> list = new ArrayList<RtuSessionStatus>(); - Iterator<Entry<String, TcpSession>> it = sessionTable.entrySet().iterator() ; - Entry<String, TcpSession> entry = null ; - while(it.hasNext()){ - entry = it.next() ; - RtuSessionStatus vo = new RtuSessionStatus() ; - vo.rtuAddr = entry.getKey() ; - IoSession se = entry.getValue().ioSession ; - vo.onTrueOffLine = se.isConnected() ; - InetSocketAddress sa = (InetSocketAddress)se.getRemoteAddress() ; - if(sa != null){ - InetAddress inetAddr = sa.getAddress() ; - if(inetAddr != null){ - vo.ip = inetAddr.getHostAddress() ; - vo.port = sa.getPort() ; - } + public static HashMap<String, Boolean> partOnLine(String[] rtuAddrArrGrp){ + synchronized (map){ + HashMap<String, Boolean> map = new HashMap<String, Boolean>(); + for(String rtuAddr : rtuAddrArrGrp){ + TcpSession tcpSe = TcpSessionCache.map.get(rtuAddr) ; + if(tcpSe != null){ + map.put(rtuAddr, tcpSe.ioSession.isConnected()) ; } - list.add(vo) ; } - return list ; + return map ; } } - - - /** - * 寰楀埌IoSession - * @param rtuAddr - * @return - */ -// public IoSession getIoSession(String rtuAddr){ -// TcpSession tcpSe = sessionMap.get(rtuAddr) ; -// if(tcpSe != null){ -// return tcpSe.ioSession ; -// } -// return null ; -// } - + /** * 缃戠粶鏄惁杩炴帴 * @param rtuAddr * @return */ public static Boolean isConnect(String rtuAddr){ - TcpSession tcpSe = sessionTable.get(rtuAddr) ; + TcpSession tcpSe = map.get(rtuAddr) ; if(tcpSe != null){ return tcpSe.ioSession.isConnected() ; } @@ -169,7 +202,7 @@ * @throws Exception */ public static void write(String rtuAddr, byte[] data) throws Exception{ - TcpSession tcpSe = sessionTable.get(rtuAddr) ; + TcpSession tcpSe = map.get(rtuAddr) ; if(tcpSe != null){ if(tcpSe.ioSession.isConnected()){ tcpSe.ioSession.write(data) ; @@ -182,34 +215,47 @@ } /** - * 璁剧疆涓婅鏁版嵁鏃跺埢 + * 褰撴湁涓婅鏁版嵁鏃� * @param rtuAddr */ - public static void cacheUpDataTime(String rtuAddr){ - TcpSession tcpSe = sessionTable.get(rtuAddr) ; + public static void whenUpData(String rtuAddr){ + TcpSession tcpSe = map.get(rtuAddr) ; if(tcpSe != null){ + tcpSe.lastDownComTime = 0L ;//缃�0锛屼娇绛夊緟lastUpDataTimeLive锛堣config.xml閰嶇疆鏂囦欢锛夋椂闀垮悗锛屽嵆鍒讳笅鍙戠紦瀛樹腑鐨勫懡浠� tcpSe.lastUpDataTime = System.currentTimeMillis() ; + tcpSe.lastUpDataTimeForOnlineCtrl = System.currentTimeMillis() ; } } /** * 鏇存柊涓婅鏁版嵁鏃跺埢 * 褰撲笂琛屾暟鎹椂鍒诲凡缁忚繃鍘讳竴瀹氭椂闀匡紝涓婅鏁版嵁鏃跺埢娓呯┖ + * 褰撲竴瀹氭椂闂村唴娌℃湁涓婅鏁版嵁锛屽垯璁や负RTU绂荤嚎 */ - public static void updateUpDataTime(Long now){ - synchronized (sessionTable){ - Iterator<TcpSession> it = sessionTable.values().iterator() ; + public static void updateRtuStatus(Long now){ + synchronized (map){ + Set<Map.Entry<String, TcpSession>> entrySet = map.entrySet() ; + Iterator<Map.Entry<String, TcpSession>> it = entrySet.iterator() ; + Map.Entry<String, TcpSession> entry ; TcpSession tcpSe ; while(it.hasNext()){ - tcpSe = it.next() ; + entry = it.next() ; + tcpSe = entry.getValue(); if(tcpSe.lastUpDataTime != null){ if(now - tcpSe.lastUpDataTime > ServerProperties.lastUpDataTimeLive){ tcpSe.lastUpDataTime = null ; } } + if(tcpSe.lastUpDataTimeForOnlineCtrl != null){ + if(tcpSe.ioSession != null && tcpSe.ioSession.isConnected()){ + if(now - tcpSe.lastUpDataTimeForOnlineCtrl > ServerProperties.disconnectedByNoUpDataMinutes){ + tcpSe.ioSession.closeNow() ; + RtuLogDealer.log(entry.getKey(), "鍥犺緝闀挎椂闂存湭鏀朵笂琛屾暟鎹紝璁や负璁惧绂荤嚎"); + } + } + } } } } - } -- Gitblit v1.8.0