Azure Service Bus中死信队列中的邮件是否过期?

Azure Service Bus中死信队列中的邮件是否过期?

一些解释

我有这些队列设置:

var queueDescription = new QueueDescription("MyTestQueue") { RequiresSession = false, DefaultMessageTimeToLive = TimeSpan.FromMinutes(1), EnableDeadLetteringOnMessageExpiration = true, MaxDeliveryCount = 10 }; namespaceManager.CreateQueue(queueDescription); 

当我将一些消息放入Azure Service Bus消息队列(不是来自Azure存储的队列)并且不消耗它们时(永远),它们将自动移动到死信队列。

但是,如果我也没有死信队列的消费者,那么这些消息是否会从死信队列中删除,还是会永远留在那里? (是否有一些官方文件说明这应该如何工作?)

我的试炼

在我的试验中,我在队列中放了3条消息 。 他们在2分钟左右就死了。 他们至少在一天内留在死信队列中,并没有被删除。

消息队列统计信息

虽然调用NamespaceManager.GetQueueAsync()给了我上面的值(注意MessageCount仍然是3DeadLetterMessageCount奇怪地为0 ),我仍然可以从死信队列中接收消息。 (所以他们没有从队列中删除。)

Sebastian你的观察是正确的,因为一旦置于DeadLetter子队列中的消息永不过期。 它们将永远在那里可用,直到从DeadLetter子队列中显式删除。 在上面关于工具/ api的错误中,它可能是一个刷新问题? GetQueueAsync()的调用需要在消息被称为死信之后进行,这不是一个确定的时间,例如,如果你有一个队列,其中有一千条消息已经过期但是Queue没有被使用(发送/接收操作) )然后计数可能仍然作为活动返回,直到执行某些操作。

在做了一些研究后,我偶然发现了一个我完全错过的事实:

即使禁用了死信,消息也可能会过期。

当消息过期而禁用死信(这是默认设置)时,它们将被删除。

因此,微软推断不能从死信队列中自动删除邮件的原因可能是:

如果您正在启用死信,那么您明确地希望过期的消息不会被丢弃,而是存储在其他地方(死信队列),以便您可以查看它们。