EasyNetQ -从现有队列接收
本文关键字:队列 EasyNetQ | 更新日期: 2023-09-27 17:49:51
我正在考虑使用EasyNetQ与RabbitMQ交互,想知道它是否可以支持以下情况:
- 队列在外部使用一些任意参数声明(例如x-message-ttl)
- 使用EasyNetQ的客户端代码从该队列发送和接收消息。
我发现的可能性有:
- 简单IBus API要求队列具有默认参数
- Advanced IAdvancedBus API允许指定声明队列的参数,但不是全部(例如x-max-length不能设置)
问题是我可以使用自定义参数的现有队列,而不需要指定它们吗?
如果队列已经存在并且您知道它的名称,难道您不能使用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,像isDurable、isExclusive、isAutoDelete和参数这样的参数也必须匹配原始的Queue声明,以避免创建新的Queue。
为安全起见,并且如果您有办法知道原始队列声明参数,请使用它们创建具有IAdvancedBus.QueueDeclare()
或IAdvancedBus.QueueDeclareAsync()
的队列