问题描述
我在分离IRedisClient.PublishMessage
和IMessageQueueClient.Publish
时遇到了困难,意识到必须将某些东西混在一起。
ServiceStack使我们可以选择以下方式收听发布/订阅广播:
static IRedisSubscription _subscription;
static IRedisClient redisClientSub;
static int received = 0;
static void ReadFromQueue()
{
redisClientSub = redisClientManager.GetClient();
_subscription = redisClientSub.CreateSubscription();
_subscription.OnMessage = (channel,msg) =>
{
try
{
received++;
}
catch (Exception ex)
{
}
};
Task.Run(() => _subscription.Subscribetochannels("Test"));
}
看起来不错,直接。但是生产者呢?
在查看可用的课程时,我认为可以使用IRedisClient.PublishMessage(string tochannel,string message)
或IMessageQueueClient.Publish(string queueName,IMessage message)
。
redisClient.PublishMessage("Test",json);
// or:
myMessageQueueClient.Publish("Test",new Message<CoreEvent>(testReq));
在两种情况下,您都可以自己指定频道名称。这是我所看到的行为:
- 上述订户仅在我使用
IRedisClient.PublishMessage(string tochannel,string message)
时收到消息,而在我使用IMessageQueueClient.Publish(string queueName,IMessage message)
时永远不会收到消息 - 如果我使用
IRedisClient.PublishMessage
进行发布,则希望填充“测试”通道(如果使用Redis浏览器查看),但实际上不是。我从没看到队列的任何痕迹(假设我没有启动订阅,但是生产者添加了消息) - 如果我使用
IMessageQueueClient.Publish(string queueName,IMessage message)
进行发布,则会创建频道“ Test”,并且消息将在那里持久保存,但是永远不会弹出/提取并删除。
我想了解两者之间的区别。我查看了源代码,并阅读了所有相关内容,但是我没有找到有关IRedisClient.PublishMessage
的任何文档。
解决方法
Mythz在ServiceStack论坛here上回答了这个问题。
他写道:
这些客户端不应互换使用,您只能 使用ServiceStack MQ客户端发送MQ消息或消息MQ 邮件包装器。
redis订阅是用于创建Redis发布/订阅的低级API 订阅,更有用的高级API是Managed Pub / Sub 将发布/订阅订阅包装在托管线程后面的服务器。
无论哪种方式,MQ Server仅设计为处理来自MQ的消息 客户,如果您要实施自己的消息传递 实现使用您自己的消息和Redis客户端而不是MQ 客户端或MQ消息类。
和
没有用于Redis Server的IRedisClient(&ServiceStack.Redis)API。 PublishMessage API发送redis PUBLISH命令。订阅 创建Redis发布/订阅订阅,请参阅Redis文档以了解如何 Redis发布/订阅作品。 ServiceStack.Redis库及其所有API 仅用于Redis Server,不包含任何内容 ServiceStack。消息传递MQ API。
因此,只需对自定义Redis Pub / Sub使用ServiceStack.Redis 订阅实施,即不使用任何ServiceStack.Messaging 仅适用于ServiceStack MQ的API。