【发布时间】:2022-02-21 02:24:32
【问题描述】:
我正在将 json 消息发布到 rabbitmq 中的队列中,并且它工作正常。但是面临一个问题,我想消耗已发布队列中的所有数据(作为聊天应用程序)并且我必须使用所有消息。
例如,我在队列中有 9 个项目,如下所示
{"Sender":123,"Message":"Test Message-1","Group":1}
{"Sender":123,"Message":"Test Message-2","Group":1}
{"Sender":123,"Message":"Test Message-3","Group":1}
{"Sender":123,"Message":"Test Message-4","Group":1}
{"Sender":567,"Message":"Test Message-5","Group":21}
{"Sender":123,"Message":"Test Message-6","Group":1}
{"Sender":456,"Message":"Test Message-7","Group":1}
{"Sender":456,"Message":"Test Message-8","Group":1}
{"Sender":123,"Message":"Test Message-9","Group":1}
这些所有消息都按我的意愿存储在队列中。但是,当我尝试使用下面的 api 调用来收集它们时,它将无法正常工作。有时获取数据但有时未获取任何数据并确认列表。那么有什么方法可以将所有或有限的数据放入 c# 中的对象或数组中。因为所有示例都将消息消费到控制台中。我需要收藏。
public IList<string> GetMessageFromQueue(string _key, bool AutoAck = false)
{
var _list = new List<string>();
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: _key,
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
var response = channel.QueueDeclarePassive(_key);
var _test= response.MessageCount;
var _test2 = response.ConsumerCount;
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
_list.Add(message);
};
//if (_list.Count == 0)
// AutoAck = false;
channel.BasicConsume(queue: _key,
autoAck: AutoAck,
consumer: consumer);
}
return _list;
}
还有我的控制器
public IActionResult Collect(){
_queueClient.GetMessageFromQueue("myKey",true);
}
由于 BasicConsume 的 autoack 属性,此方法 olsa 会清除队列。我也尝试使用 basicAck。
在rabbitmq/c#中将消息发送到对象数组以进行下一步操作的最佳方法是什么。
【问题讨论】:
标签: c# rabbitmq message-queue amqp