【问题标题】:Can I use duplicate detection to cancel a scheduled Azure service bus message?我可以使用重复检测来取消计划的 Azure 服务总线消息吗?
【发布时间】:2018-01-05 03:29:11
【问题描述】:

我正在尝试提出为 Azure 服务总线队列或主题安排消息的最佳方式,同时让选项保持打开状态以立即发送消息而不是预定消息。如果我尝试在第一条消息的预定时间或之后发送替换消息,我想确保自己可以防止创建重复消息。

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

【问题讨论】:

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


    【解决方案1】:

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

    输出:

    如果您想取消预定的消息,您可以尝试在该预定消息变为活动之前致电CancelScheduledMessageAsync() method

    client.CancelScheduledMessageAsync(sequenceNumber).Wait();
    

    【讨论】:

    • 根据您的证据,很高兴知道重复检测还会检查计划邮件中的重复邮件,而不是仅检查过去已排队的邮件。老实说,我有点失望,因为我的理论行为本可以让我避免存储预定消息的序列号以便稍后取消它(相反,我将使用消息的业务上下文所独有的 MessageId )。感谢您查看此内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多