Azure 是否手动将邮件发布到死信队列?

Azure 是否手动将邮件发布到死信队列?,azure,azureservicebus,Azure,Azureservicebus,为什么会有人想这么做?我必须在我们的应用程序中对异常处理机制进行单元测试 我假设死信队列实际上是azure服务总线队列,在这里我可以使用QueueClient string dlQ = @"sb://**.servicebus.windows.net/**/Subscriptions/DefaultSubscription/$DeadLetterQueue"; string connectionString = CloudConfigurationManager.GetSetting("Micr

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

我假设死信队列实际上是azure服务总线队列,在这里我可以使用
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)
{

}

但是我得到了
消息AgingEntityNotFoundException
。有什么问题吗?

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


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

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


订阅必须将
EnableDeadLetteringNoMessageExpatition
设置为true。

虽然在这里晚了些时候,添加@Mikee和@Ben Morris的答案可能会有帮助。您可以利用@Mike的建议,使用
message.DeadLetter()
message.DeadLetterAsync()
来死信消息。另一个建议是设置非常短或0秒
TimeToLive
,将消息移动到死信

在执行这些操作并尝试查看活动结束队列中的消息后,您可能仍然会发现该消息有时可用(您当前所面对的)。原因是由于
TTLExpiredException
headersizeextended
或任何系统定义的错误而导致的死信消息,或手动死信消息(如
DeadLetter()
方法),会由异步“垃圾收集”程序定期清理。这并不是我们所期望的立即发生


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

我觉得这个答案中的第一句话直接忽略了问题的第一段。“您永远不会希望直接发布到死信队列”--嗯,是的,如果您正在编写一个专门测试DLQ消息处理的自动测试,您会这样做。那就是,你知道,整个问题是关于什么的-幸运的是,这对我不起作用。我尝试了一个小到
TimeSpan.FromTicks(1)
的TimeToLive,但Azure函数使用者仍然在它死信之前对它进行了处理。这是一个专门用于测试的主题/订阅,因此我将改为调用
BrokeredMessage.DeadLetter()
。哦,不,我的消费者没有违反物理属性。要使此解决方案起作用,订阅必须将
EnableDeadLetteringOnMessageExpatition
设置为true,而我的设置没有设置。@Johann答案中有此设置是的,因为我添加了它。消息不会突然移动为死信,作为一个独立的异步垃圾收集,它在服务端运行,并定期移动消息。当您偷看()消息时,它对您是可用的,但当您收到()消息时,垃圾收集程序将被迫首先运行,然后您不会收到“即将移动到死信”消息,我猜这是您的问题。