2016-11-16 97 views
0

在Azure服务总线中,我希望发送消息失败,并且没有定义任何订阅。我通过将EnableFilteringMessagesBeforePublishing设置为true来实现此目标,这会引发异常NoMatchingSubscriptionException在发送到Azure服务总线中的主题时DeadLettering BrokeredMessages

现在,在处理这个异常时,我想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队列中结束以供以后调查?

谢谢

回答

0

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

在问候的策略,你有两个问题:

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

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

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