问题描述
我正在使用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,徘徊不去,并且从未检索过:
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)