EasyNetQ -从现有队列接收

本文关键字:队列 EasyNetQ | 更新日期: 2023-09-27 17:49:51

我正在考虑使用EasyNetQ与RabbitMQ交互,想知道它是否可以支持以下情况:

  1. 队列在外部使用一些任意参数声明(例如x-message-ttl)
  2. 使用EasyNetQ的客户端代码从该队列发送和接收消息。

我发现的可能性有:

    简单IBus API要求队列具有默认参数
  • Advanced IAdvancedBus API允许指定声明队列的参数,但不是全部(例如x-max-length不能设置)

问题是我可以使用自定义参数的现有队列,而不需要指定它们吗?

EasyNetQ -从现有队列接收

如果队列已经存在并且您知道它的名称,难道您不能使用IAdvancedBus.Consume<T>方法(而不用担心IAdvancedBus.QueueDeclare)吗?

例如:

var queueName = "TheNameOfYourExistingQueue";
var existingQueue = new EasyNetQ.Topology.Queue(queueName, false);
// bus should be an instance of IAdvancedBus
bus.Consume<TypeOfYourMessage>(existingQueue, 
   (msg, info) => 
      {
         // Implement your handling logic here
      });

注意,EasyNetQ可能在自动反序列化消息到TypeOfYourMessage实例时遇到问题。如果是这种情况,解决它的一种方法是绕过EasyNetQ的消息序列化器,这样您就可以直接访问消息的字节数组。如果您希望走这条路,请使用以下对Consume的重载:

void Consume(IQueue queue, Func<Byte[], MessageProperties, MessageReceivedInfo, Task> onMessage);

即使使用解决方案10477404,像isDurableisExclusiveisAutoDelete参数这样的参数也必须匹配原始的Queue声明,以避免创建新的Queue。

为安全起见,并且如果您有办法知道原始队列声明参数,请使用它们创建具有IAdvancedBus.QueueDeclare()IAdvancedBus.QueueDeclareAsync()的队列