在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。
关于策略,你有两个问题:
- 有用户吗?
- 如何处理发送操作失败的消息?
第一个问题更多的是关于你所做的假设,即这些应用程序不应该继续。第二个问题是在整个应用程序运行时肯定会发生的事情,您需要决定应该采取什么补偿措施。
就我个人而言,我不会启用EnableFilteringMessagesBeforePublishing
功能,除非你绝对需要知道没有发布者(问题1)。如果您更关心消息a发送失败的事实,而不是没有发布者,我建议使用自定义代码来捕获失败,并将其作为另一种类型的消息发送到一个确定存在的队列中(即您的应用程序确保它存在)。