| 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 ; | 
|     } | 
|   | 
|     /** | 
|      * 缓存命令 | 
|      * @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() ; | 
|     } | 
|   | 
| } |