如果未指定订阅,则发送到主题的邮件会丢失

时间:2016-11-15 15:06:21

标签: azure azureservicebus

在Azure Service Bus中,如果下面是事件序列,那么一切都很好 -

  1. 创建主题
  2. 在主题内创建订阅
  3. 向主题发送消息
  4. 如上所述,在发送消息时会触发订阅。这是预期的。

    但是,如果我们像这样修改上面的序列

    1. 创建主题
    2. 向主题发送消息
    3. 在主题内创建订阅
    4. 在这种情况下,由于消息在没有订阅的情况下发送到主题,因此在确实创建订阅时,先前发送的消息不会显示在其列表中。这些消息基本上是“丢失”的。我也无法在Service Bus Explorer中看到这些消息。

      上述顺序流程是相关的,因为我们已经分离了发布者和订阅者,发布者只是发送消息和订阅者,当他们联机时,创建订阅并处理它们。发布商和订阅者上线的顺序无法保证。

      如何在创建订阅之前访问/处理发送到主题的消息?这些消息首先会发生什么?

      由于

1 个答案:

答案 0 :(得分:4)

事实证明,上述行为是设计的 - 如果没有订阅,则消息将丢失。

为了解决这个问题,Azure Service Bus提供了一个关于主题的属性,以便在发送消息之前对其进行预过滤。因此,如果没有可用的过滤器/订阅,它将抛出异常

在主题

上设置选项
namespaceManager.CreateTopicAsync(new TopicDescription(topicName)
{
    EnableFilteringMessagesBeforePublishing = true
});

在发送消息时,检查异常

try
{
    await topicClient.SendAsync(brokeredMessage);
}
catch (NoMatchingSubscriptionException ex)
{
 // handle the exception, maybe send it to dead letter queue using DeadLetterAsync
}