RabbitMQ - 知道哪个消息是Acked

时间:2016-03-21 13:47:44

标签: c# rabbitmq

我试图发布两条消息并接收Ack / Nack。以下是我的代码:

<script type="text/javascript" charset="utf-8"> function open() {$.ajax{{ url: "/script", type: "POST", dataType: "json",), [...] }); }; function functionname(value){ [...] }; open();

我的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事件调用。我甚至能够将e.DeliveryTag称为1和2(我希望这些是我处理的消息的序列号)。

我想知道哪条消息更准确,而不是依赖序列号来执行某些操作。

有没有办法可以在消息中添加唯一标识符,并在Ack / Nack事件args中返回相同的ID,以验证特定消息是否已被确认。谢谢你的指示。

我们假设,例如,我一直在查询文件夹并从该文件夹中读取文件列表并将内容发布到队列中。文件可能会被激活;另一个人可能会被嘲笑;我想知道哪个文件已被确认或已被解雇,以便我可以将文件移动到相应的成功/失败文件夹。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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

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

事件处理程序

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