手动将消息发布到死信队列?

时间:2015-01-23 11:49:20

标签: azure azureservicebus

为什么有人想这样做?我必须在我们的应用程序中对异常处理机制进行单元测试。

我认为死信队列实际上是天蓝色的服务总线队列,我可以使用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。可能有什么不对?

3 个答案:

答案 0 :(得分:3)

您永远不会想直接发布到死信队列。这是放置无法处理的有毒消息的地方。

将消息放入死信队列有两种方法。服务总线本身死信超过最大传递尝试次数。您还可以使用DeadLetter()方法明确地将您收到的消息写入死信。

答案 1 :(得分:1)

使用非常短的TTL创建您的消息 BrokeredMessage.TimeToLive 属性

答案 2 :(得分:0)

尽管在这里晚了,但将@Mikee和@Ben Morris的答案添加进去可能会对某人有所帮助。您可以利用@Mike的建议,即使用message.DeadLetter()message.DeadLetterAsync()来给邮件添加死信。另一个建议是将TimeToLive设置为非常少或0秒,以将邮件移至“死信”。

执行这些操作中的任何一个并尝试查看“活动”结束队列中的消息后,您仍然可能会发现有时消息可用(您当前所面对的消息)。原因是由于TTLExpiredExceptionHeaderSizeExceeded或任何系统定义的错误而死信的消息,或诸如DeadLetter()方法之类的手动死信消息均由异步< strong>“垃圾收集” 程序。这不会像我们期望的那样立即发生。

执行Peek操作时,仍然可以看到消息在活动队列中。您必须等待垃圾收集器运行,或者可以执行Receive操作,该操作会强制垃圾收集器首先运行,从而在完成检索之前将消息移至死信。