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() ; 
 | 
    } 
 | 
  
 | 
} 
 |