c# - EasyNetQ 主题路由

标签 c# rabbitmq easynetq

嗨,我有一个问题,我有一个主要服务和两个客户端服务,客户端服务可以通过唯一的 id 来标识,而不是在下水道和客户端之间进行通信我使用 RabbitMq 和 EasyNetQ,所以我想要的是使用单个队列某种路由,这样客户端就会知道,这不是消息不适合我,并且不要使用它。我认为基于主题的路由可以,但出了点问题,所有客户端都会交替收到消息,一个客户端一个另一个客户端。我不想使用很多队列,并且这些客户端的数量可能会增加。

所以我的订阅者(客户端服务端)看起来像:

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);

那么我可以做些什么来做到这一点吗?

最佳答案

您可以在订阅者(客户端)端解决此问题:不使用 bus.SubscribeAsync,而是调用 bus.Advanced.Bind,然后调用 bus.Advanced .消费Advanced 字段的类型为 IAdvancedBus,提供对队列通信和配置的更方便功能的访问。 IAdvancedBus.Bind 方法接受路由 key 并设置订阅者与 RabbitMQ 通信所需的基本配置,而 IAdvancedBus.Consume 方法实际上开始异步监听传入消息。

关于c# - EasyNetQ 主题路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57411217/

相关文章:

c# - 跨线程集合控制

java - 如何使Spring Integration AMQP队列事务解耦?

EasyNetQ - 如何在 EasyNetQ_Default_Error_Queue 消息中包含原始队列名称?

c# - EasyNetQ/RabbitMq : How to prevent duplicate message handling during debug?

c# - 我可以通过提供方法本身来获取方法的名称吗?

c# - ASP.NET 动态添加 UserControl 到 PlaceHolder,不触发 Click 事件,只触发 Page_Load

java - 如何让多个客户倾听同一消费者的声音?

c# - 无法在 Unity 项目上添加 EasyNetQ 的引用

c# - Cross Thread错误处理形式与Timer

django - EC2 上的 RabbitMQ 消耗大量 CPU