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为例手动添加一个名为List的名为“ Objectbroadcast”的新密钥并添加一个条目,我希望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中,我在Redis的Objectbroadcast中看到生成的JSON,徘徊不去,并且从未检索过:

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)