Пример #1
0
        private static RedisPubSubMessage ToPubSubMessage(RedisPubSubResponse response)
        {
            if (response.Type == RedisPubSubResponseType.PMessage)
            {
                return(new RedisPubSubMessage(RedisPubSubMessageType.PMessage, response.Channel, response.Pattern, response.Data as byte[]));
            }

            if (response.Type == RedisPubSubResponseType.Message)
            {
                return(new RedisPubSubMessage(RedisPubSubMessageType.Message, response.Channel, response.Pattern, response.Data as byte[]));
            }

            return(RedisPubSubMessage.Empty);
        }
Пример #2
0
        private void ResponseReceived(IRedisRawResponse response)
        {
            m_LastMessageSeenTime = DateTime.UtcNow;

            var pubSubResp = RedisPubSubResponse.ToPubSubResponse(response);

            if (!pubSubResp.IsEmpty)
            {
                switch (pubSubResp.Type)
                {
                case RedisPubSubResponseType.Message:
                {
                    var subscriptions = m_Subscriptions;
                    if (subscriptions != null &&
                        subscriptions.HasCallbacks(pubSubResp.Channel))
                    {
                        subscriptions.Invoke(ToPubSubMessage(pubSubResp));
                    }
                }
                break;

                case RedisPubSubResponseType.PMessage:
                {
                    var subscriptions = m_PSubscriptions;
                    if (subscriptions != null &&
                        subscriptions.HasCallbacks(pubSubResp.Pattern))
                    {
                        subscriptions.Invoke(ToPubSubMessage(pubSubResp));
                    }
                }
                break;

                case RedisPubSubResponseType.Subscribe:
                {
                    lock (m_SubscriptionLock)
                    {
                        var bag = m_PendingSubscriptions.Drop(pubSubResp.Channel);
                        m_Subscriptions.Register(pubSubResp.Channel, bag);
                    }
                }
                break;

                case RedisPubSubResponseType.PSubscribe:
                {
                    lock (m_PSubscriptionLock)
                    {
                        var bag = m_PendingPSubscriptions.Drop(pubSubResp.Pattern);
                        m_PSubscriptions.Register(pubSubResp.Pattern, bag);
                    }
                }
                break;

                case RedisPubSubResponseType.Unsubscribe:
                {
                    lock (m_SubscriptionLock)
                    {
                        if (pubSubResp.Channel.IsEmpty())
                        {
                            m_PendingSubscriptions.UnregisterAll();
                            m_Subscriptions.UnregisterAll();
                        }
                        else
                        {
                            if (!m_Subscriptions.Unregister(pubSubResp.Channel))
                            {
                                m_PendingSubscriptions.Unregister(pubSubResp.Channel);
                            }
                        }
                    }
                }
                break;

                case RedisPubSubResponseType.PUnsubscribe:
                {
                    lock (m_PSubscriptionLock)
                    {
                        if (pubSubResp.Pattern.IsEmpty())
                        {
                            m_PendingPSubscriptions.UnregisterAll();
                            m_PSubscriptions.UnregisterAll();
                        }
                        else
                        {
                            if (!m_PSubscriptions.Unregister(pubSubResp.Pattern))
                            {
                                m_PendingPSubscriptions.Unregister(pubSubResp.Pattern);
                            }
                        }
                    }
                }
                break;

                default:
                    break;
                }
            }
        }