RabbitMQ - 知道哪条消息被确认

RabbitMQ - Know which message is Acked

我正在尝试发布和接收两条消息 Ack/Nack。下面是我的代码:

using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    channel.BasicAcks += channel_BasicAcks;
                    channel.BasicNacks += channel_BasicNacks;

                    channel.QueueDeclare("test", durable, false, false, null);
                    channel.ConfirmSelect();

                    var properties = channel.CreateBasicProperties();
                    properties.SetPersistent(true);

                    string message = "Hello World!";
                    var body = Encoding.UTF8.GetBytes(message);

                    channel.BasicPublish("", "test", properties, body);
                    channel.BasicPublish("", "test", properties, body);
                    Console.WriteLine(" [x] Sent {0}", message);

                    channel.WaitForConfirmsOrDie();
                }
            }

我的 Ack/Nack 事件

 static void channel_BasicNacks(object sender, RabbitMQ.Client.Events.BasicNackEventArgs e)
    {

    }

    static void channel_BasicAcks(object sender, RabbitMQ.Client.Events.BasicAckEventArgs e)
    {

    }

对于这两条消息,我完美地收到了两次 Ack 事件调用。我什至可以 e.DeliveryTag 作为 1 和 2(我希望这些是我处理的消息的序列号)。

我想知道哪个消息被 acked/nacked 更准确​​,而不是依赖于序列号来执行某些操作。

有没有一种方法可以将唯一标识符附加到消息,并在 Ack/Nack 事件参数中返回相同的 ID,以验证特定消息是否被确认/取消。谢谢指点

让我们举个例子,我一直在轮询一个文件夹并从该文件夹读取文件列表并将内容发布到队列。一个文件可能被ack;另一个人可能会被剥夺;我想知道哪个文件被 acked 或 nacked 以便我可以将文件移动到相应的成功/失败文件夹。

A​​MQP 的 Basic.Ack 方法没有空间容纳用户指定的内容,所以不,您不能使用任意 ID。

但是,您可以 query the next sequence ID 将用于下一次发布,并在本地维护一个映射以将消息与其序列 ID 相关联。

序列 ID 从 1 开始,因此 NextPublishSeqNo() 将 return 在任何发布之前为 1,在第一次发布之后为 2,依此类推。

您可以向事件处理程序添加额外的参数并知道哪些消息未被确认

channel.BasicNacks += (sender, e) => channel_BasicNacks(sender, e, message);

事件处理程序

private static void channel_BasicNacks(object sender, BasicNackEventArgs e,string message)
{
    Console.WriteLine(message);
}