2016-03-21 102 views
1

我想發佈兩條消息並收到Ack/Nack。下面是我的代碼:RabbitMQ - 知道哪些消息是Acked

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(我希望那些是我處理的消息的序列號)。

我想知道哪個消息更精確,而不是依賴於序列號來執行某些操作。

有沒有辦法,我可以追加一個唯一的標識符來消息,並得到相同的ID回的Ack/Nack事件參數來驗證一個特定的消息獲得確認/ NACK的一種方式。感謝您的指點。

讓我們說,例如,我一直輪詢一個文件夾,該文件夾中的文件的閱讀清單和內容發佈到隊列。一個文件可能會被抄襲;另一個可能被扼殺;我想知道哪個文件被ack或nacked,以便我可以將文件移動到各自的成功/失敗的文件夾。

回答

3

AMQP的Basic.Ack方法沒有足夠的空間用於用戶指定的內容,所以,不,你不能使用任意ID。

但是,您可以query the next sequence ID將被用於下一次發佈,並在本地維護的地圖信息給其序列ID相關聯。

序列ID從1開始,所以NextPublishSeqNo()會後的第一個發佈等返回1發佈的任何之前,2。

+0

在這種情況下,我想我必須在分配順序我的文件運行時間,並記住這個順序,直到我得到所有acks/nacks。 – techspider

+0

是的,這將工作。 –

0

您可以添加額外的參數給事件處理程序,並知道這消息是不是承認

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

事件處理程序

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