New file |
| | |
| | | package com.dy.rtuMw.server.forTcp; |
| | | |
| | | |
| | | import com.dy.common.queue.Node; |
| | | import com.dy.common.queue.Queue; |
| | | import com.dy.common.mw.protocol.MidResultFromRtu; |
| | | import com.dy.common.mw.protocol.MidResultToRtu; |
| | | import com.dy.rtuMw.server.ServerProperties; |
| | | |
| | | /** |
| | | * 非线程安全的,只能在单线程中运行 |
| | | */ |
| | | public class TcpDownCommandCache { |
| | | |
| | | //TCP下行命令缓存队列 |
| | | private static Queue cacheQueue = new Queue("tcpDownCommandQueue") ; |
| | | |
| | | private static TcpDownCommandCache instance = new TcpDownCommandCache() ; |
| | | |
| | | private TcpDownCommandCache(){ |
| | | cacheQueue.setLimit(ServerProperties.cacheUpDownDataWarnCount, ServerProperties.cacheUpDownDataMaxCount); |
| | | } |
| | | |
| | | public static TcpDownCommandCache getInstance(){ |
| | | return instance ; |
| | | } |
| | | |
| | | |
| | | public static Integer[] info(){ |
| | | Integer comTotalDown = 0 ;//缓存的下行命令总数 |
| | | Integer comNoResTotalDownByOnLine = 0 ;//RTU在线,但对其下行命令未收到应答的总数 |
| | | Integer comNoResTotalDownByOffLine = 0 ;//RTU离线,但对其下行命令未收到应答的总数 |
| | | MidResultToRtu res ; |
| | | TcpDownCommandObj obj ; |
| | | Node node = cacheQueue.getFirstNode() ; |
| | | while(node != null && node.obj != null){ |
| | | obj = (TcpDownCommandObj)node.obj; |
| | | res = obj.result ; |
| | | if(!obj.onceReceivedResult){ |
| | | comTotalDown ++ ; |
| | | if(TcpSessionCache.isConnect(res.rtuAddr)){ |
| | | comNoResTotalDownByOnLine ++ ; |
| | | }else{ |
| | | comNoResTotalDownByOffLine ++ ; |
| | | } |
| | | } |
| | | } |
| | | return new Integer[]{comTotalDown, comNoResTotalDownByOnLine, comNoResTotalDownByOffLine} ; |
| | | } |
| | | |
| | | /** |
| | | * 缓存命令 |
| | | * @param result |
| | | * @throws Exception |
| | | */ |
| | | public static void cacheCommand(MidResultToRtu result) throws Exception{ |
| | | if(result != null){ |
| | | if(result.maxSendTimes == null){ |
| | | //设置最大发送次数 |
| | | result.maxSendTimes = ServerProperties.downComandMaxResendTimes ; |
| | | } |
| | | if(result.isSendFirst){ |
| | | cacheQueue.pushHead(new TcpDownCommandObj(result)); |
| | | }else{ |
| | | cacheQueue.pushTail(new TcpDownCommandObj(result)); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 匹配命令结果 |
| | | * @param rsFromRtu |
| | | * @return |
| | | */ |
| | | public static MidResultToRtu matchFromHead(MidResultFromRtu rsFromRtu){ |
| | | MidResultToRtu res = null ; |
| | | TcpDownCommandObj obj = null ; |
| | | Node node = cacheQueue.getFirstNode() ; |
| | | while(node != null && node.obj != null){ |
| | | obj = (TcpDownCommandObj)node.obj; |
| | | res = obj.result ; |
| | | if(res != null |
| | | && res.rtuAddr.equals(rsFromRtu.rtuAddr) |
| | | && res.downCode.equals(rsFromRtu.upCode)){ |
| | | obj.onceReceivedResult = true ;//标识已经收到命令结果 |
| | | return res ; |
| | | }else{ |
| | | node = node.next ; |
| | | } |
| | | } |
| | | |
| | | return null ; |
| | | } |
| | | |
| | | /** |
| | | * 匹配命令结果 |
| | | * @param rsFromRtu |
| | | * @return |
| | | */ |
| | | public static MidResultToRtu matchFromTail(MidResultFromRtu rsFromRtu){ |
| | | MidResultToRtu res = null ; |
| | | TcpDownCommandObj obj = null ; |
| | | Node node = cacheQueue.getLastNode() ; |
| | | while(node != null && node.obj != null){ |
| | | obj = (TcpDownCommandObj)node.obj; |
| | | res = obj.result ; |
| | | if(res != null |
| | | && res.rtuAddr.equals(rsFromRtu.rtuAddr) |
| | | && res.downCode.equals(rsFromRtu.upCode)){ |
| | | obj.onceReceivedResult = true ;//标识已经收到命令结果 |
| | | return res ; |
| | | }else{ |
| | | node = node.pre ; |
| | | } |
| | | } |
| | | |
| | | return null ; |
| | | } |
| | | |
| | | /** |
| | | * 得到第一个节点 |
| | | * @return |
| | | */ |
| | | public static Node getFirstQueueNode(){ |
| | | return cacheQueue.getFirstNode() ; |
| | | } |
| | | |
| | | /** |
| | | * 得到最后一个节点 |
| | | * @return |
| | | */ |
| | | public static Node getLastQueueNode(){ |
| | | return cacheQueue.getLastNode() ; |
| | | } |
| | | |
| | | /** |
| | | * 移除节点 |
| | | * @param node |
| | | */ |
| | | public static void removeNode(Node node){ |
| | | cacheQueue.remove(node); |
| | | } |
| | | |
| | | /** |
| | | * 缓存的节点数 |
| | | * @Return 缓存节点数 |
| | | */ |
| | | public static Integer size(){ |
| | | return cacheQueue.size() ; |
| | | } |
| | | |
| | | } |