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 сохраняется и никогда не извлекается: