【问题标题】:EasyNetQ Topic RoutingEasyNetQ 主题路由
【发布时间】:2019-12-16 02:00:15
【问题描述】:

您好我有一个问题我有一个主要服务和两个客户端服务,客户端服务可以通过唯一 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);

那么我能做些什么呢?

【问题讨论】:

    标签: c# rabbitmq easynetq


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 2016-08-02
      • 1970-01-01
      • 2013-08-16
      相关资源
      最近更新 更多