【问题标题】:Get queueName in Message listner of RabbitMq在 RabbitMq 的消息侦听器中获取队列名称
【发布时间】:2020-06-13 08:34:14
【问题描述】:

我正在循环中创建多个消费者,通过这些消费者我可以监听多个队列。这种方法的问题是我能够从不同的队列中获取事件,但所有队列都使用相同的消费者,因此很难识别该事件发生在哪个队列中。如果我能得到消费者部分下的队列名就好了。

          consumer.Received += async (model, ea) =>
                {
                    var body = ea.Body;
                    var message = Encoding.UTF8.GetString(body);
                };

【问题讨论】:

    标签: asp.net asp.net-core websocket rabbitmq rabbitmq-exchange


    【解决方案1】:

    ea 变量有一些有趣的字段,你检查了吗?

    ea.Exchange 显示此消息是从哪个交易所发布的。

    ea.RoutingKey 显示消息的路由信息​​。可能有队列名称。

    此外,您可以在定义标题时将标题放入消息中。

    IBasicProperties props = channel.CreateBasicProperties();
    props.Headers.Add("queueName",  "myQueue1");
    channel.BasicPublish(exchangeName,
                       routingKey, props,
                       messageBodyBytes);
    

    您可以在消费者功能中阅读它们:

    consumer.Received += async (model, ea) =>
                    {
                        var name = ea.BasicProperties.Headers["queueName"];
                        var body = ea.Body;
                        var message = Encoding.UTF8.GetString(body);
                    };
    

    【讨论】:

    • 感谢您的回复,但我无法在标题中添加队列名称,因为我们正在通过与许多队列绑定的交换器发送数据。所以在队列中添加不同的标题会很困难。
    • 可能您应该为您的问题添加更多详细信息,因为我无法理解您要做什么。如果你正在创建一个标准或普通的应用程序,可能你的拓扑是错误的,否则你应该吃掉你的青蛙并做困难的事情。
    【解决方案2】:

    解决方案是在 channel.BasicConsume 中使用“consumerTag”

    channel.BasicConsume(..., consumerTag: "YourQueueName");
    

    然后你可以在消息监听器中检索队列名称:

    consumer.Received += async (model, ea) =>
                {
                    var body = ea.Body;
                    var message = Encoding.UTF8.GetString(body);
                    var queueName = ea.ConsumerTag;
                };
    

    警告:如果 ConsumerTag 对您的系统很重要,请不要使用此解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多