我正在创建一个 .NET 应用程序,该应用程序将从我的应用程序未创建或维护的多个第三方队列中使用,并且我希望每个队列每个进程实例有一个消费者。当我创建一个消费者时,我可以给它一个当前进程 ID 的标签,但我看不到任何方法可以在以后检索该标签,除非我保留消费者对象。
我可以想到几种方法来自己跟踪当前打开的通道,但是如果我可以检查队列以查看通道上是否已经有一个活跃的消费者,并且该通道的标签带有进程ID。
IBasicConsumer
有一个 ConsumerTags
属性,它只返回该消费者的标签,我没有看到访问其他消费者标签的方法。
我还看到
IModel
有一个 ConsumerCount()
方法,但这似乎返回队列上的消费者总数,而不仅仅是给定通道的消费者总数。即使如此,这也只是消费者数量,没有关于他们的其他信息。
IModel channel = connection.CreateModel();
// Only returns the current consumer's tags
var consumer = new AsyncEventingBasicConsumer();
string[] tags = consumer.ConsumerTags;
// Only returns count of total consumers
int count = channel.ConsumerCount("my.queue");
// This also returns the tag for the consumer used for the operation
string tag = channel.BasicConsume(consumer, "my.queue", true, "MyTag");
tag == "MyTag"; // true
// Hoping to do something like this
//var tags = channel.GetConsumers().SelectMany(c => c.ConsumerTags);
有没有办法让我轮询队列并返回任何当前消费者的标签?
您的应用程序可以通过 RabbitMQ 的 HTTP API 获取相当多的信息 - https://rawcdn.githack.com/rabbitmq/rabbitmq-server/v3.9.14/deps/rabbitmq_management/priv/www/api/index.html
但是,我不能 100% 确定消费者标签是否暴露。
否则,也许使用专门用于协调消费者的队列是一个不错的选择。