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

时间:2014-05-13 09:06:56

标签: c# azure message-queue azureservicebus

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分钟左右就死了。他们至少在一天内一直处于死信的队列中,并且没有被删除。

Message Queue Statistics

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

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:4)

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

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

当消息过期时,如果禁用了死信(这是默认设置),它们就会被删除。

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

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