| New file | 
|  |  |  | 
|---|
|  |  |  | package com.dy.aceMw.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.aceMw.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 ; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 缓存命令 | 
|---|
|  |  |  | * @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.pre ; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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() ; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|