为什么有人想这样做?我必须在我们的应用程序中对异常处理机制进行单元测试。
我认为死信队列实际上是天蓝色的服务总线队列,我可以使用QueueClient
string dlQ = @"sb://**.servicebus.windows.net/**/Subscriptions/DefaultSubscription/$DeadLetterQueue";
string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");
NamespaceManager _namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
QueueDescription qd = _namespaceManager.GetQueue(dataPromotionDLQ);
var queueClient = QueueClient.CreateFromConnectionString(connectionString, "DefaultSubscription/$DeadLetterQueue");
BrokeredMessage brokeredMessage = new BrokeredMessage("Message to PublishToDLQ");
try
{
queueClient.Send(brokeredMessage);
}
catch (Exception)
{
}
但我得MessagingEntityNotFoundException
。可能有什么不对?
答案 0 :(得分:3)
您永远不会想直接发布到死信队列。这是放置无法处理的有毒消息的地方。
将消息放入死信队列有两种方法。服务总线本身死信超过最大传递尝试次数。您还可以使用DeadLetter()方法明确地将您收到的消息写入死信。
答案 1 :(得分:1)
使用非常短的TTL创建您的消息 BrokeredMessage.TimeToLive 属性
答案 2 :(得分:0)
尽管在这里晚了,但将@Mikee和@Ben Morris的答案添加进去可能会对某人有所帮助。您可以利用@Mike的建议,即使用message.DeadLetter()
或message.DeadLetterAsync()
来给邮件添加死信。另一个建议是将TimeToLive
设置为非常少或0秒,以将邮件移至“死信”。
执行这些操作中的任何一个并尝试查看“活动”结束队列中的消息后,您仍然可能会发现有时消息可用(您当前所面对的消息)。原因是由于TTLExpiredException
,HeaderSizeExceeded
或任何系统定义的错误而死信的消息,或诸如DeadLetter()
方法之类的手动死信消息均由异步< strong>“垃圾收集” 程序。这不会像我们期望的那样立即发生。
执行Peek
操作时,仍然可以看到消息在活动队列中。您必须等待垃圾收集器运行,或者可以执行Receive
操作,该操作会强制垃圾收集器首先运行,从而在完成检索之前将消息移至死信。