2017-07-29 76 views
1

我試圖想出安排Azure服務總線隊列或主題的消息的最佳方式,同時保留打開選項以立即發送消息而不是計劃的消息。如果我嘗試在第一條消息的預定時間或之後發送替換消息,我想確保自己能夠防止創建重複消息。我可以使用重複檢測來取消預定的Azure服務總線消息嗎?

如果你打開重複檢測,並且兩個消息具有相同的MessageId,那麼在第一個消息的排定入隊時間之前發送第二個消息是否有效地取消了預定消息?另外,如果預定的消息首先成功排隊,那麼假設第二條消息將被忽略是否安全?

回答

2

如果打開重複檢測並且兩個消息具有相同的MessageId,那麼在第一個消息的預定排隊時間之前發送第二個消息是否有效地取消了預定消息?

我用下面的示例代碼做了測試,發現第二條消息將被忽略。

var client = QueueClient.CreateFromConnectionString(connectionString, queueName); 

for (int i = 0; i < 2; i++) 
{ 
    if (i == 0) 
    { 
     client.SendAsync(new BrokeredMessage("testmes1") { MessageId = "test1", ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddSeconds(60) }).Wait(); 
    } 
    else 
    { 
     client.SendAsync(new BrokeredMessage("testmes2") { MessageId = "test1" }).Wait(); 
    } 

} 

從隊列中接收消息:

client.OnMessage(message => 
{ 
    Console.WriteLine(String.Format("Message body: {0}", message.GetBody<String>())); 
    Console.WriteLine(String.Format("Message id: {0}", message.MessageId)); 
}); 

輸出:

enter image description here

如果您想取消預定的消息,你可以嘗試在此之前調用CancelScheduledMessageAsync() method預定消息變爲活動

client.CancelScheduledMessageAsync(sequenceNumber).Wait(); 
+0

根據你的證據,這是很好的知道,重複檢測也檢查預定消息重複的,而不是那些在過去只排隊檢查郵件。我真的有點失望,因爲我的理論行爲會讓我避免存儲預定消息的序列號以便稍後取消它(相反,我將使用消息的業務上下文獨有的MessageId )。感謝您看看這個。 –

相關問題