예제 #1
0
 public RedisManagedServerNode(RedisManagerSettings settings, RedisRole role, RedisManagedServer server,
                               Action <object, RedisCardioPulseStatus> onPulseStateChange, bool ownsSeed = true)
     : base(settings, role, server, onPulseStateChange, ownsSeed)
 {
     m_OnPulseStateChange = onPulseStateChange;
     m_EndPoint           = (server != null) ? server.EndPoint : RedisEndPoint.Empty;
     if (server != null)
     {
         server.SetOnPulseStateChange(onPulseStateChange);
     }
 }
예제 #2
0
        private RedisManagedNodesGroup ToNodesGroup(RedisRole role, RedisAsyncClient[] clients)
        {
            if (!clients.IsEmpty())
            {
                var baseSettings = Settings;

                var nodeList = new List <RedisManagedNode>();
                foreach (var client in clients)
                {
                    try
                    {
                        if (client != null && client.Connected)
                        {
                            IPEndPoint ipEP = null;

                            var endPoint = client.EndPoint;
                            if (endPoint != null)
                            {
                                ipEP = endPoint as IPEndPoint;
                                if (ipEP == null)
                                {
                                    var dnsEP = endPoint as DnsEndPoint;
                                    if (dnsEP != null)
                                    {
                                        var ipEPs = (new RedisEndPoint(dnsEP.Host, dnsEP.Port)).ResolveHost();
                                        if (!ipEPs.IsEmpty())
                                        {
                                            ipEP = new IPEndPoint(ipEPs[0], dnsEP.Port);
                                        }
                                    }
                                }
                            }

                            if (ipEP == null)
                            {
                                client.Dispose();
                            }
                            else
                            {
                                var settings = (RedisManagerSettings)baseSettings.Clone(ipEP.Address.ToString(), ipEP.Port);

                                if (role == RedisRole.Sentinel)
                                {
                                    var listener = new RedisManagedSentinelListener(client, settings, null);
                                    nodeList.Add(new RedisManagedSentinelNode(settings, listener, null));
                                }
                                else
                                {
                                    var server = new RedisManagedServer(client, settings, role, null);
                                    nodeList.Add(new RedisManagedServerNode(settings, role, server, null));
                                }
                            }
                        }
                    }
                    catch (Exception)
                    {
                        client.Dispose();
                    }
                }

                if (nodeList.Count > 0)
                {
                    var settings = (RedisManagerSettings)Settings;

                    return(role != RedisRole.Sentinel ?
                           (RedisManagedNodesGroup)(new RedisManagedServerGroup(settings, role, nodeList.Cast <RedisManagedServerNode>().ToArray(), null)) :
                           new RedisManagedSentinelGroup(settings, settings.MasterName, nodeList.Cast <RedisManagedSentinelNode>().ToArray(), null));
                }
            }
            return(null);
        }