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
仍然是3
但DeadLetterMessageCount
奇怪地0
),我仍然可以收到来自死信队列的消息。 (所以他们没有从队列中删除。)
答案 0 :(得分:8)
Sebastian你的观察是正确的,因为一旦置于DeadLetter子队列中的消息永不过期。它们将永远在那里可用,直到从DeadLetter子队列中显式删除。在上面关于工具/ api的错误中,它可能是一个刷新问题? GetQueueAsync()的调用需要在消息被称为死信之后进行,这不是一个确定的时间,例如,如果你有一个队列,其中有一千条消息已经过期但是Queue没有被使用(发送/接收操作) )然后计数可能仍然作为活动返回,直到执行某些操作。
答案 1 :(得分:4)
在做了一些研究之后,我偶然发现了一个我完全错过的事实:
即使禁用了死信,消息也会过期。
当消息过期时,如果禁用了死信(这是默认设置),它们就会被删除。
因此,微软推断不能从死信队列中自动删除邮件的原因可能是:
如果您正在启用死信,那么显式希望过期的消息不会被丢弃,而是存储在其他地方(死信队列),以便您可以查看它们。