在Azure Service Bus中,如果下面是事件序列,那么一切都很好 -
如上所述,在发送消息时会触发订阅。这是预期的。
但是,如果我们像这样修改上面的序列
在这种情况下,由于消息在没有订阅的情况下发送到主题,因此在确实创建订阅时,先前发送的消息不会显示在其列表中。这些消息基本上是“丢失”的。我也无法在Service Bus Explorer中看到这些消息。
上述顺序流程是相关的,因为我们已经分离了发布者和订阅者,发布者只是发送消息和订阅者,当他们联机时,创建订阅并处理它们。发布商和订阅者上线的顺序无法保证。
如何在创建订阅之前访问/处理发送到主题的消息?这些消息首先会发生什么?
由于
答案 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
}