RabbitMQ 只监听队列中的第一条消息
RabbitMQ only listens to the first message on a queue
我的 Rabbit 队列出现问题,目前仅对队列中的第一条消息作出反应,之后推送的任何其他消息都将被忽略。
我首先实例化连接并在我的 IQueueConnectionProvider 中声明队列:
var connectionFactory = new ConnectionFactory() { HostName = hostName };
var connection = _connectionFactory.CreateConnection();
var channel = connection.CreateModel();
然后在我的 IQueueListener 中使用 IQueueConnectionProvider 作为依赖项,只有一种方法:
public void ListenToQueue(string queue)
{
var channel = _queueConnectionProvider.GetQueue();
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
string path = @"d:\debug.log.txt";
File.AppendAllLines(path, new List<string>() {"MESSAGE RECEIVED", Environment.NewLine });
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
channel.BasicAck(ea.DeliveryTag, false);
};
channel.BasicConsume(queue, true, consumer);
}
我的日志文件最终只有一行 "MESSAGE RECEIVED",但是我可以在 Rabbit ui 界面中看到我的其他服务正在将消息推送到该队列。
我在这里遗漏了什么吗?
代码运行良好!已经用我的队列进行了测试,并且能够在日志文件中获得 "MESSAGE RECEIVED" 9 次;因为我的队列中有 9 条消息。
我试过没有这行代码,它运行良好
变量通道 = _queueConnectionProvider.GetQueue();
这是一个愚蠢的错误……又一次。
channel.BasicConsume(queue, false, consumer);
这就是我需要的。我想手动确认我的消息,因此 noAck
需要 false
;
我的 Rabbit 队列出现问题,目前仅对队列中的第一条消息作出反应,之后推送的任何其他消息都将被忽略。
我首先实例化连接并在我的 IQueueConnectionProvider 中声明队列:
var connectionFactory = new ConnectionFactory() { HostName = hostName };
var connection = _connectionFactory.CreateConnection();
var channel = connection.CreateModel();
然后在我的 IQueueListener 中使用 IQueueConnectionProvider 作为依赖项,只有一种方法:
public void ListenToQueue(string queue)
{
var channel = _queueConnectionProvider.GetQueue();
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
string path = @"d:\debug.log.txt";
File.AppendAllLines(path, new List<string>() {"MESSAGE RECEIVED", Environment.NewLine });
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
channel.BasicAck(ea.DeliveryTag, false);
};
channel.BasicConsume(queue, true, consumer);
}
我的日志文件最终只有一行 "MESSAGE RECEIVED",但是我可以在 Rabbit ui 界面中看到我的其他服务正在将消息推送到该队列。
我在这里遗漏了什么吗?
代码运行良好!已经用我的队列进行了测试,并且能够在日志文件中获得 "MESSAGE RECEIVED" 9 次;因为我的队列中有 9 条消息。
我试过没有这行代码,它运行良好 变量通道 = _queueConnectionProvider.GetQueue();
这是一个愚蠢的错误……又一次。
channel.BasicConsume(queue, false, consumer);
这就是我需要的。我想手动确认我的消息,因此 noAck
需要 false
;