ServiceStack.Mq: почему IRedisSubscription.OnMessage не запускается при добавлении данных в канал вручную?

Я использую ServiceStack и IRedisSubscriber. Я заставил его работать, запустив OnMessage. Однако иногда он не срабатывает, и я пытаюсь понять, почему.

Базовая настройка:

        RedisClientManager = new PooledRedisClientManager("localhost:6379");

        _mqServer = new RedisMqServer(RedisClientManager, retryCount: 2)
        {
            RequestFilter = RequestFilter
        };

        _mqServer.Start(); //Starts listening for messages

В отдельном классе у меня есть:

    public MqChannelSubscriber(string eventChannelName, Action<CoreRequest> onMessageReceived)
    {
        _redisClient = MqClientFactory.Instance.GetRedisClient();
        _subscription = _redisClient.CreateSubscription();

        _subscription.OnSubscribe = channel => Log.Instance.LogInfo($"Subscription started on {eventChannelName}");
        _subscription.OnUnSubscribe = channel => Log.Instance.LogWarning($"Unsubscribed from {eventChannelName}");

        _subscription.OnMessage = (channel, msg) =>
        {
            try
            {
                onMessageReceived(GetRequest(msg));
            }
            catch (Exception ex)
            {
                Log.Instance.LogException(ex);
            }
        };
        Task.Run(() => _subscription.SubscribeToChannels(eventChannelName));
    }

В этом случае eventChannelName - "ObjectBroadcast".

Вопрос 1. Если я вручную, используя, например, Redis Insight, добавлю новый ключ с именем "ObjectBroadcast" типа List и добавлю одну запись, я бы ожидал, что OnMessage будет запущен выше, но это не так. Почему это?

Вопрос 2: У меня есть другое приложение, которое производит эти "широковещательные сообщения" следующим образом:

    public static void Broadcast<T>(T coreBroadcast) where T : CoreBroadcast
    {
        // Option 1: this will trigger the OnMessage above
        using (var redisClient = MqClientFactory.Instance.GetRedisClient())
        {
            string json = JsonConvert.SerializeObject(coreBroadcast, new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.All
            });
            redisClient.PublishMessage(coreBroadcast.BroadcastChannel, json);
        }

        // Option 2: this will not trigger the OnMessage above
        using (var messageQueueClient = MqClientFactory.Instance.CreateMessageQueueClient())
        {
            messageQueueClient.Publish(coreBroadcast.BroadcastChannel, new Message<T>(coreBroadcast));
        }
    }

Выше представлены два способа отправки: IRedisClient.PublishMessage и IMessageQueueClient.Publish. Как отмечено в комментариях, вариант 1 вызывает сообщение OnMessage, а вариант 2 - нет. Почему это?

В варианте 2 я вижу, что созданный JSON в ObjectBroadcast в Redis сохраняется и никогда не извлекается:

0 ответов

Другие вопросы по тегам