嗨,我有一个问题,我有一个主服务和两个客户端服务,客户端服务可以通过唯一的id来标识,而不是在下水道和客户端之间通信。我使用带有EasyNetQ的RabbitMq,所以我想要的是使用带有某种路由的单个队列,这样客户端就会知道,这不是消息不是给我的,也不会消耗它。我原以为基于主题的路由就行了,但有些地方不对劲,所有的客户端都会轮流接收消息,一个客户端一个客户端另一个客户端。而且我不想使用太多的队列,这些客户端的数量可能会增长。
因此,我的订阅者(客户端服务端)如下所示:
var topic = $"ProjectId.{ProjectId}.CabinId.{CabinId}";
var responseHandler = new Func<ManualServiceRequestMessage, Task>
(response => Task.Factory.StartNew(() =>
{
Console.WriteLine($"!!!!!!!!! {topic} !!!!!!!!!!");
Console.WriteLine($"Response pid {response.ProjectId} cid {response.CabinId}");
})
.ContinueWith(task =>
{
if (!task.IsCompleted && task.IsFaulted)
{
Console.WriteLine($"Message receive problem {response.ProjectId} frame type {response.CabinId} response id {response.RequestHash}");
}
}));
bus.SubscribeAsync<ManualServiceRequestMessage>("LiveServer.ManualRequestQueue", responseHandler, x => x.WithTopic(topic));发布者(服务器端)
var topic = $"ProjectId.{projectId}.CabinId.{cabinId}";
bus.PublishAsync(requestService, topic);那么我能做些什么来做到这一点?
发布于 2019-08-08 23:33:00
您可以在订阅者(客户端)端解决此问题:调用bus.Advanced.Bind,然后调用bus.Advanced.Consume,而不是使用bus.SubscribeAsync。Advanced字段的类型为IAdvancedBus,它提供了对更方便的队列通信和配置功能的访问。IAdvancedBus.Bind方法接受路由键并设置订阅者与RabbitMQ通信所需的基本配置,IAdvancedBus.Consume方法实际上开始异步侦听传入的消息。
https://stackoverflow.com/questions/57411217
复制相似问题