我可以使用重复检测来取消预定的Azure服务总线消息吗?

问题描述:

我试图想出安排Azure服务总线队列或主题的消息的最佳方式,同时保留打开选项以立即发送消息而不是计划的消息。如果我尝试在第一条消息的预定时间或之后发送替换消息,我想确保自己能够防止创建重复消息。我可以使用重复检测来取消预定的Azure服务总线消息吗?

如果你打开重复检测,并且两个消息具有相同的MessageId,那么在第一个消息的排定入队时间之前发送第二个消息是否有效地取消了预定消息?另外,如果预定的消息首先成功排队,那么假设第二条消息将被忽略是否安全?

如果打开重复检测并且两个消息具有相同的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 )。感谢您看看这个。 –