예제 #1
0
 /// <summary>
 ///     单方向信道抽象父类,提供了相关的基本操作
 /// </summary>
 /// <param name="channel">基于流的通讯信道</param>
 /// <param name="protocolStack">协议栈</param>
 protected OnewayChannel(IRawTransportChannel channel, IProtocolStack protocolStack)
 {
     if (channel == null)
     {
         throw new ArgumentNullException(nameof(channel));
     }
     if (!channel.IsConnected)
     {
         throw new ArgumentException("Current raw transport channel hsa been disconnected!");
     }
     if (protocolStack == null)
     {
         throw new ArgumentNullException(nameof(protocolStack));
     }
     if (!protocolStack.Initialize())
     {
         throw new ArgumentException("Cannot initialize current protocol stack!");
     }
     _channel = channel;
     if (_channel.Buffer == null)
     {
         _channel.Buffer = new ReceiveBuffer(102400);
     }
     _logicalAddress        = _channel.LogicalAddress;
     _address               = _channel.Address;
     _channel.Disconnected += RawChannelDisconnected;
     _channel.ReceivedData += RawChannelReceivedData;
     _protocolStack         = protocolStack;
 }
예제 #2
0
        /// <summary>
        ///     创建一个新的连接代理器
        /// </summary>
        /// <param name="iep">远程终结点地址</param>
        /// <param name="protocolStack">协议栈</param>
        /// <param name="transactionManager">事务管理器</param>
        /// <returns>如果无法连接到远程地址,则返回null.</returns>
        public static IThriftConnectionAgent Create(IPEndPoint iep, IProtocolStack <ThriftMessage> protocolStack, ThriftMessageTransactionManager transactionManager)
        {
            if (iep == null)
            {
                throw new ArgumentNullException("iep");
            }
            if (protocolStack == null)
            {
                throw new ArgumentNullException("protocolStack");
            }
            if (transactionManager == null)
            {
                throw new ArgumentNullException("transactionManager");
            }
            ITransportChannel transportChannel = new TcpTransportChannel(iep);

            transportChannel.Connect();
            if (!transportChannel.IsConnected)
            {
                return(null);
            }
            IMessageTransportChannel <ThriftMessage> msgChannel = new MessageTransportChannel <ThriftMessage>((IRawTransportChannel)transportChannel, protocolStack, new ThriftProtocolSegmentDataParser((ThriftProtocolStack)protocolStack));

            return(new ThriftConnectionAgent(msgChannel, transactionManager));
        }
        /// <summary>
        ///     创建一个新的连接代理器
        /// </summary>
        /// <param name="iep">远程终结点地址</param>
        /// <param name="protocolStack">协议栈</param>
        /// <param name="transactionManager">事务管理器</param>
        /// <returns>如果无法连接到远程地址,则返回null.</returns>
        /// <exception cref="System.ArgumentNullException">非法参数</exception>
        public static IServerConnectionAgent <BaseMessage> Create(IPEndPoint iep, IProtocolStack protocolStack, MessageTransactionManager transactionManager)
        {
            if (iep == null)
            {
                throw new ArgumentNullException(nameof(iep));
            }
            if (protocolStack == null)
            {
                throw new ArgumentNullException(nameof(protocolStack));
            }
            if (transactionManager == null)
            {
                throw new ArgumentNullException(nameof(transactionManager));
            }
            ITransportChannel transportChannel = new TcpTransportChannel(iep);

            transportChannel.Connect();
            if (!transportChannel.IsConnected)
            {
                return(null);
            }
            IMessageTransportChannel <BaseMessage> msgChannel = new MessageTransportChannel <BaseMessage>((IRawTransportChannel)transportChannel, protocolStack);

            return(new IntellectObjectConnectionAgent(msgChannel, transactionManager));
        }
예제 #4
0
 /// <summary>
 ///     数据段解析器元接口
 /// </summary>
 /// <param name="protocolStack">协议栈</param>
 public SegmentDataParser(IProtocolStack protocolStack)
 {
     if (protocolStack == null)
     {
         throw new ArgumentNullException(nameof(protocolStack));
     }
     _protocolStack = protocolStack;
 }
 /// <summary>
 ///     注册指定服务角色的协议栈
 /// </summary>
 /// <param name="role">角色名称</param>
 /// <param name="protocolStack">协议栈</param>
 public void Regist(string role, IProtocolStack protocolStack)
 {
     if (string.IsNullOrEmpty(role))
     {
         throw new ArgumentNullException("role");
     }
     _protocolStacks[role] = protocolStack;
 }
예제 #6
0
 /// <summary>
 ///     注册指定服务角色的协议栈
 /// </summary>
 /// <param name="role">服务角色</param>
 /// <param name="protocolStack">协议栈</param>
 /// <exception cref="ArgumentNullException">参数不能为空</exception>
 public static void Regist(string role, IProtocolStack protocolStack)
 {
     if (string.IsNullOrEmpty(role))
     {
         throw new ArgumentNullException(nameof(role));
     }
     if (protocolStack == null)
     {
         throw new ArgumentNullException(nameof(protocolStack));
     }
     _protocolStackContainer.Regist(role, protocolStack);
 }
예제 #7
0
 /// <summary>
 ///     单方向信道抽象父类,提供了相关的基本操作
 /// </summary>
 /// <param name="protocolStack">协议栈</param>
 protected OnewayChannel(IProtocolStack protocolStack)
 {
     if (protocolStack == null)
     {
         throw new ArgumentNullException(nameof(protocolStack));
     }
     if (!protocolStack.Initialize())
     {
         throw new ArgumentException("Cannot initialize current protocol stack!");
     }
     _protocolStack = protocolStack;
 }
예제 #8
0
 /// <summary>
 ///     注册指定服务角色的协议栈
 /// </summary>
 /// <param name="role">服务角色</param>
 /// <param name="protocolStack">协议栈</param>
 /// <exception cref="ArgumentNullException">参数不能为空</exception>
 public void Regist(string role, IProtocolStack <BaseMessage> protocolStack)
 {
     if (string.IsNullOrEmpty(role))
     {
         throw new ArgumentNullException("role");
     }
     if (protocolStack == null)
     {
         throw new ArgumentNullException("protocolStack");
     }
     _protocolStacks[role] = protocolStack;
 }
예제 #9
0
 /// <summary>
 ///     消息传输信道
 /// </summary>
 /// <param name="rawChannel">数据流信道</param>
 /// <param name="protocolStack">协议栈</param>
 /// <param name="parser">解析器</param>
 /// <exception cref="ArgumentNullException">参数错误</exception>
 public MessageTransportChannel(IRawTransportChannel rawChannel, IProtocolStack protocolStack, ISegmentDataParser <T> parser)
 {
     if (rawChannel == null)
     {
         throw new ArgumentNullException("rawChannel");
     }
     if (protocolStack == null)
     {
         throw new ArgumentNullException("protocolStack");
     }
     if (rawChannel.SupportSegment && parser == null)
     {
         throw new ArgumentNullException("parser");
     }
     _rawChannel  = rawChannel;
     _channelType = _rawChannel.ChannelType;
     //initialize segment data parser, if current channel support segment data recv.
     if (_rawChannel.SupportSegment)
     {
         _parser = parser;
         _parser.ParseSucceed            += SegmentParseSucceed;
         _rawChannel.ReceivedDataSegment += ReceivedDataSegment;
     }
     else
     {
         _rawChannel.ReceivedData += RawReceivedData;
         if (_rawChannel.Buffer == null)
         {
             _rawChannel.Buffer = new ReceiveBuffer(ChannelConst.RecvBufferSize);
         }
     }
     _protocolStack            = protocolStack;
     _rawChannel.Opened       += Opened;
     _rawChannel.Opening      += Opening;
     _rawChannel.Closed       += Closed;
     _rawChannel.Closing      += Closing;
     _rawChannel.Faulted      += Faulted;
     _rawChannel.Disconnected += RawChannelDisconnected;
     _rawChannel.Connected    += Connected;
     _key       = _rawChannel.Key;
     _localIep  = _rawChannel.LocalEndPoint;
     _remoteIep = _rawChannel.RemoteEndPoint;
     //open this channel at last.
     _rawChannel.Open();
 }
예제 #10
0
 /// <summary>
 ///     获取具有指定唯一标示的消息通信信道
 /// </summary>
 /// <param name="iep">远程终结点地址,如果给予的目标key在当前连接池中并不存在任何连接,则会使用此参数来创建一个连接</param>
 /// <param name="key">连接标示</param>
 /// <param name="protocolStack">协议栈</param>
 /// <param name="transactionManager">网络事务管理器</param>
 /// <returns>返回一个消息通信信道</returns>
 public virtual IThriftConnectionAgent GetChannel(IPEndPoint iep, string key, IProtocolStack <ThriftMessage> protocolStack, object transactionManager)
 {
     try
     {
         lock (_lockObj)
         {
             ConnectionSet <ThriftMessage> connectionSet;
             if (!_connections.TryGetValue(key, out connectionSet))
             {
                 connectionSet     = new SequentialConnectionSet <ThriftMessage>(_min, _max, new Tuple <IPEndPoint, IProtocolStack <ThriftMessage>, object>(iep, protocolStack, transactionManager), CreateAgent);
                 connectionSet.Tag = key;
                 _connections.Add(key, connectionSet);
             }
             return(connectionSet.GetConnection());
         }
     }
     catch (Exception ex)
     {
         _tracing.Error(ex, null);
         return(null);
     }
 }
예제 #11
0
 /// <summary>
 ///     获取具有指定唯一标示的消息通信信道
 /// </summary>
 /// <param name="iep">远程终结点地址,如果给予的目标key在当前连接池中并不存在任何连接,则会使用此参数来创建一个连接</param>
 /// <param name="key">连接标示</param>
 /// <param name="protocolStack">协议栈</param>
 /// <param name="transactionManager">网络事务管理器</param>
 /// <returns>返回一个消息通信信道</returns>
 public virtual IThriftConnectionAgent GetChannel(IPEndPoint iep, string key, IProtocolStack<ThriftMessage> protocolStack, object transactionManager)
 {
     try
     {
         lock (_lockObj)
         {
             ConnectionSet<ThriftMessage> connectionSet;
             if (!_connections.TryGetValue(key, out connectionSet))
             {
                 connectionSet = new SequentialConnectionSet<ThriftMessage>(_min, _max, new Tuple<IPEndPoint, IProtocolStack<ThriftMessage>, object>(iep, protocolStack, transactionManager), CreateAgent);
                 connectionSet.Tag = key;
                 _connections.Add(key, connectionSet);
             }
             return connectionSet.GetConnection();
         }
     }
     catch (Exception ex)
     {
         _tracing.Error(ex, null);
         return null;
     }
 }
예제 #12
0
 /// <summary>
 ///     输出通道元接口,提供了相关的基本操作。
 /// </summary>
 /// <param name="channel">基于流的通讯信道</param>
 /// <param name="protocolStack">协议栈</param>
 public OutputChannel(IRawTransportChannel channel, IProtocolStack protocolStack)
     : base(channel, protocolStack)
 {
 }
예제 #13
0
 /// <summary>
 ///     根据当前负载器规则获取一个通信信道
 /// </summary>
 /// <param name="target">标示网络终点接的协议簇组合</param>
 /// <param name="level">KAE应用等级</param>
 /// <param name="protocolStack">协议栈</param>
 /// <param name="errMsg">错误信息</param>
 /// <param name="selectedRingNode">已选中的一致性HASH圆环节点</param>
 /// <returns>如果指定条件的通信信道不存在,则会创建它并返回</returns>
 /// <exception cref="ArgumentNullException">参数不能为空</exception>
 public IServerConnectionAgent <TMessage> GetChannel(Protocols target, ApplicationLevel level, IProtocolStack protocolStack, out string errMsg, out KAERingNode selectedRingNode)
 {
     lock (_lockObj)
     {
         IDictionary <ApplicationLevel, IDictionary <ProtocolTypes, KetamaRing> > firstLevel;
         if (_addresses.TryGetValue(target, out firstLevel))
         {
             IDictionary <ProtocolTypes, KetamaRing> secondLevel;
             if (firstLevel.TryGetValue(level, out secondLevel))
             {
                 KetamaRing ring;
                 if (secondLevel.TryGetValue(_protocolType, out ring))
                 {
                     if (ring == null)
                     {
                         errMsg           = string.Format("#Sadly, We have no more network information about what you gave of protocol: {0}-{1}-{2}, Maybe it was been removed or there wasn't any available network resources.", target.ProtocolId, target.ServiceId, target.DetailsId);
                         selectedRingNode = null;
                         return(null);
                     }
                     KAERingNode node = ring.GetWorkerNode();
                     IServerConnectionAgent <TMessage> agent = _connectionPool.GetChannel(node.EndPoint, node.RawAddress, protocolStack, _transactionManager);
                     errMsg           = (agent != null ? string.Empty : "#Sadly, We cannot connect to remote endpoint: " + node.RawAddress);
                     selectedRingNode = node;
                     return(agent);
                 }
             }
         }
         errMsg           = string.Format("#Couldn't find any remoting address which it can access it. #Protocol: {0}, #Level: {1}", target, level);
         selectedRingNode = null;
         return(null);
     }
 }
        /// <summary>
        ///     获取具有指定标示的连接代理器,如果具有该条件的代理器不存在,则会创建一个新的代理器
        /// </summary>
        /// <param name="key">连接标示</param>
        /// <param name="roleId">服务角色编号</param>
        /// <param name="protocolStack">连接所承载的协议栈</param>
        /// <param name="transactionManager">事务管理器</param>
        /// <returns>如果返回null, 则表示当前无法连接到目标远程终结点地址</returns>
        public IThriftConnectionAgent GetChannel(string key, string roleId, IProtocolStack <ThriftMessage> protocolStack, ThriftMessageTransactionManager transactionManager)
        {
            string fullKey = string.Format("{0}#{1}", roleId, key);

            return(base.GetChannel(key, fullKey, protocolStack, transactionManager));
        }
예제 #15
0
 /// <summary>
 ///     输出通道元接口,提供了相关的基本操作。
 /// </summary>
 /// <param name="protocolStack">协议栈</param>
 public OutputChannel(IProtocolStack protocolStack)
     : base(protocolStack)
 {
 }
예제 #16
0
 /// <summary>
 ///    创建一个新的服务器端连接代理器,并将其注册到当前的连接池中
 /// </summary>
 /// <param name="iep">要创建连接的远程终结点地址</param>
 /// <param name="protocolStack">协议栈</param>
 /// <param name="transactionManager">网络事务管理器</param>
 /// <returns>返回已经创建好的服务器端连接代理器</returns>
 protected abstract IThriftConnectionAgent CreateAgent(IPEndPoint iep, IProtocolStack <ThriftMessage> protocolStack, object transactionManager);
 /// <summary>
 ///    创建一个新的服务器端连接代理器,并将其注册到当前的连接池中
 /// </summary>
 /// <param name="iep">要创建连接的远程终结点地址</param>
 /// <param name="protocolStack">协议栈</param>
 /// <param name="transactionManager">网络事务管理器</param>
 /// <returns>返回已经创建好的服务器端连接代理器</returns>
 protected override IThriftConnectionAgent CreateAgent(IPEndPoint iep, IProtocolStack <ThriftMessage> protocolStack, object transactionManager)
 {
     return(ThriftConnectionAgent.Create(iep, protocolStack, (ThriftMessageTransactionManager)transactionManager));
 }
예제 #18
0
 /// <summary>
 ///     ����һ���µ����Ӵ�����
 /// </summary>
 /// <param name="iep">Զ���ս���ַ</param>
 /// <param name="protocolStack">Э��ջ</param>
 /// <param name="transactionManager">���������</param>
 /// <returns>����޷����ӵ�Զ�̵�ַ���򷵻�null.</returns>
 public static IThriftConnectionAgent Create(IPEndPoint iep, IProtocolStack<ThriftMessage> protocolStack, ThriftMessageTransactionManager transactionManager)
 {
     if (iep == null) throw new ArgumentNullException("iep");
     if (protocolStack == null) throw new ArgumentNullException("protocolStack");
     if (transactionManager == null) throw new ArgumentNullException("transactionManager");
     ITransportChannel transportChannel = new TcpTransportChannel(iep);
     transportChannel.Connect();
     if (!transportChannel.IsConnected) return null;
     IMessageTransportChannel<ThriftMessage> msgChannel = new MessageTransportChannel<ThriftMessage>((IRawTransportChannel)transportChannel, protocolStack, new ThriftProtocolSegmentDataParser((ThriftProtocolStack) protocolStack));
     return new ThriftConnectionAgent(msgChannel, transactionManager);
 }
예제 #19
0
 /// <summary>
 ///    创建一个新的服务器端连接代理器,并将其注册到当前的连接池中
 /// </summary>
 /// <param name="iep">要创建连接的远程终结点地址</param>
 /// <param name="protocolStack">协议栈</param>
 /// <param name="transactionManager">网络事务管理器</param>
 /// <returns>返回已经创建好的服务器端连接代理器</returns>
 protected override IServerConnectionAgent <BaseMessage> CreateAgent(IPEndPoint iep, IProtocolStack protocolStack, object transactionManager)
 {
     return(IntellectObjectConnectionAgent.Create(iep, protocolStack, (MessageTransactionManager)transactionManager));
 }
 /// <summary>
 ///     获取具有指定标示的连接代理器,如果具有该条件的代理器不存在,则会创建一个新的代理器
 /// </summary>
 /// <param name="key">连接标示</param>
 /// <param name="roleId">服务角色编号</param>
 /// <param name="protocolStack">连接所承载的协议栈</param>
 /// <param name="transactionManager">事务管理器</param>
 /// <returns>如果返回null, 则表示当前无法连接到目标远程终结点地址</returns>
 public IThriftConnectionAgent GetChannel(string key, string roleId, IProtocolStack<ThriftMessage> protocolStack, ThriftMessageTransactionManager transactionManager)
 {
     string fullKey = string.Format("{0}#{1}", roleId, key);
     return base.GetChannel(key, fullKey, protocolStack, transactionManager);
 }
 /// <summary>
 ///    创建一个新的服务器端连接代理器,并将其注册到当前的连接池中
 /// </summary>
 /// <param name="iep">要创建连接的远程终结点地址</param>
 /// <param name="protocolStack">协议栈</param>
 /// <param name="transactionManager">网络事务管理器</param>
 /// <returns>返回已经创建好的服务器端连接代理器</returns>
 protected override IThriftConnectionAgent CreateAgent(IPEndPoint iep, IProtocolStack<ThriftMessage> protocolStack, object transactionManager)
 {
     return ThriftConnectionAgent.Create(iep, protocolStack, (ThriftMessageTransactionManager)transactionManager);
 }
예제 #22
0
        /// <summary>
        ///     获取具有指定标示的连接代理器,如果具有该条件的代理器不存在,则会创建一个新的代理器
        /// </summary>
        /// <param name="key">连接标示</param>
        /// <param name="roleId">服务角色编号</param>
        /// <param name="protocolStack">连接所承载的协议栈</param>
        /// <param name="transactionManager">事务管理器</param>
        /// <returns>如果返回null, 则表示当前无法连接到目标远程终结点地址</returns>
        public IServerConnectionAgent <MetadataContainer> GetChannel(string key, string roleId, IProtocolStack protocolStack, MetadataTransactionManager transactionManager)
        {
            string fullKey = string.Format("{0}#{1}", roleId, key);

            return(base.GetChannel(key, fullKey, protocolStack, transactionManager));
        }
예제 #23
0
 /// <summary>
 ///    创建一个新的服务器端连接代理器,并将其注册到当前的连接池中
 /// </summary>
 /// <param name="iep">要创建连接的远程终结点地址</param>
 /// <param name="protocolStack">协议栈</param>
 /// <param name="transactionManager">网络事务管理器</param>
 /// <returns>返回已经创建好的服务器端连接代理器</returns>
 protected override IServerConnectionAgent <MetadataContainer> CreateAgent(IPEndPoint iep, IProtocolStack protocolStack, object transactionManager)
 {
     return(MetadataConnectionAgent.Create(iep, protocolStack, (MetadataTransactionManager)transactionManager));
 }
예제 #24
0
 /// <summary>
 ///    创建一个新的服务器端连接代理器,并将其注册到当前的连接池中
 /// </summary>
 /// <param name="iep">要创建连接的远程终结点地址</param>
 /// <param name="protocolStack">协议栈</param>
 /// <param name="transactionManager">网络事务管理器</param>
 /// <returns>返回已经创建好的服务器端连接代理器</returns>
 protected abstract IServerConnectionAgent <TMessage> CreateAgent(IPEndPoint iep, IProtocolStack protocolStack, object transactionManager);
예제 #25
0
 /// <summary>
 ///     获取具有指定唯一标示的消息通信信道
 /// </summary>
 /// <param name="iep">远程终结点地址,如果给予的目标key在当前连接池中并不存在任何连接,则会使用此参数来创建一个连接</param>
 /// <param name="key">连接标示</param>
 /// <param name="protocolStack">协议栈</param>
 /// <param name="transactionManager">网络事务管理器</param>
 /// <returns>返回一个消息通信信道</returns>
 public virtual IThriftConnectionAgent GetChannel(string iep, string key, IProtocolStack<ThriftMessage> protocolStack, object transactionManager)
 {
     return GetChannel(iep.ConvertToIPEndPoint(), key, protocolStack, transactionManager);
 }
예제 #26
0
 /// <summary>
 ///    创建一个新的服务器端连接代理器,并将其注册到当前的连接池中
 /// </summary>
 /// <param name="iep">要创建连接的远程终结点地址</param>
 /// <param name="protocolStack">协议栈</param>
 /// <param name="transactionManager">网络事务管理器</param>
 /// <returns>返回已经创建好的服务器端连接代理器</returns>
 protected abstract IThriftConnectionAgent CreateAgent(IPEndPoint iep, IProtocolStack<ThriftMessage> protocolStack, object transactionManager);
예제 #27
0
 /// <summary>
 ///     获取具有指定唯一标示的消息通信信道
 /// </summary>
 /// <param name="iep">远程终结点地址,如果给予的目标key在当前连接池中并不存在任何连接,则会使用此参数来创建一个连接</param>
 /// <param name="key">连接标示</param>
 /// <param name="protocolStack">协议栈</param>
 /// <param name="transactionManager">网络事务管理器</param>
 /// <returns>返回一个消息通信信道</returns>
 public virtual IServerConnectionAgent <TMessage> GetChannel(string iep, string key, IProtocolStack protocolStack, object transactionManager)
 {
     return(GetChannel(iep.ConvertToIPEndPoint(), key, protocolStack, transactionManager));
 }
예제 #28
0
 /// <summary>
 ///     消息传输信道
 /// </summary>
 /// <param name="rawChannel">数据流信道</param>
 /// <param name="protocolStack">协议栈</param>
 /// <exception cref="ArgumentNullException">参数错误</exception>
 public MessageTransportChannel(IRawTransportChannel rawChannel, IProtocolStack protocolStack)
     : this(rawChannel, protocolStack, new SegmentDataParser <T>(protocolStack))
 {
 }