【发布时间】:2016-07-05 17:30:55
【问题描述】:
我有几个关于 RabbitMQ 编码的问题...我对这个世界并不陌生,并且有一些问题是基于提供给我的用于实现的设计...
- 如果我从消费者发送 BasicAck 或 BasicAack,它是否只删除 来自队列的相应消息还是将其传递给 发布者?
- 如何确保 Publisher 仅在 Consumer 准备好进行处理时才向 Server 发送消息?
设计上说 Publisher 需要等待并知道 Consumer 的处理何时完成才能在客户端执行某些任务(取决于成功/失败)。
我已经尝试了下面的代码,但出队立即从队列中删除了消息,而我没有发送任何 Ack 或 Nack。我很困惑
发布者代码:
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.QueueDeclare("test", durable, false, false, null);
channel.TxSelect();
var properties = channel.CreateBasicProperties();
properties.SetPersistent(true);
string message = "Hello World!";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish("", "test", properties, body);
channel.TxCommit();
Console.WriteLine(" [x] Sent {0}", message);
}
}
消费者代码
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.QueueDeclare("test", durable, false, false, null);
var consumer = new QueueingBasicConsumer(channel);
channel.BasicConsume("test", true, consumer);
Console.WriteLine(" [*] Waiting for messages." +
"To exit press CTRL+C");
while (true)
{
var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
}
}
}
注意:我意识到channel.BasicConsume("test", true, consumer); 的 noAck 为 true。我把它改成了channel.BasicConsume("test", false, consumer);
当我使用channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); 时,我可以看到消息已从队列中删除但是,Publisher 是如何知道 Consumer 处理成功的呢?
【问题讨论】: