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

时间:2017-07-29 00:20:07

标签: c# azure-servicebus-queues azure-servicebus-topics

我试图找到为Azure服务总线队列或主题安排消息的最佳方法,同时保持选项打开以立即发送消息而不是预定消息。如果我尝试在第一条消息的预定时间或之后发送替换消息,我想确保自己能够保护自己不会创建重复的消息。

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

1 个答案:

答案 0 :(得分:3)

  

如果您打开重复检测并且两条消息都具有相同的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();