在Azure服务总线中发送到主题时对broker消息进行deadlettertering



在Azure服务总线中,我希望在没有定义订阅的情况下消息发送失败。我通过将EnableFilteringMessagesBeforePublishing set设置为true来实现这一点,这会抛出异常NoMatchingSubscriptionException

现在,在处理此异常时,我想将其DeadLetter。如果我调用BrokeredMessage.DeadLetter(),它抛出InvalidOperation和消息' ReceiveContext is null '

try
{
    await topicClient.SendAsync(brokeredMessage);
}
catch (NoMatchingSubscriptionException ex)
{
    // **throws exception** if message is attempted to move to DeadLetter queue
    await brokeredMessage.DeadLetterAsync(); 
}

这意味着消息只有在被接收时才能被DeadLetter'ed,而不是在发送时。

以上假设正确吗?

在任何情况下,处理消息发送失败的最佳策略是什么?发送时失败的消息是否有可能在DeadLetter队列中结束,以供以后调查?

谢谢

死信队列(DLQ)与发送消息的队列相关联。如果没有订阅(这是一个队列),也没有关联的DLQ。

关于策略,你有两个问题:

  1. 有用户吗?
  2. 如何处理发送操作失败的消息?

第一个问题更多的是关于你所做的假设,即这些应用程序不应该继续。第二个问题是在整个应用程序运行时肯定会发生的事情,您需要决定应该采取什么补偿措施。

就我个人而言,我不会启用EnableFilteringMessagesBeforePublishing功能,除非你绝对需要知道没有发布者(问题1)。如果您更关心消息a发送失败的事实,而不是没有发布者,我建议使用自定义代码来捕获失败,并将其作为另一种类型的消息发送到一个确定存在的队列中(即您的应用程序确保它存在)。

最新更新