尝试将消息设置到期(个人),仍然准备好'在队列中?

时间:2015-03-12 15:16:05

标签: rabbitmq

我正在尝试将RabbitMQ消息发布到队列(默认情况下没有设置TTL),其中发布的每条消息都可以指定单个TTL。我相信我在C#中这样做:

    public override bool PostData(object data, int? ttl = null)
    {
        try
        {
            _channel.QueueDeclare(_queue, true, false, false, null);

            var body = NET.ObjectToByteArray(data);
            var properties = _channel.CreateBasicProperties();
            if (ttl != null)  // <----- here
                properties.Expiration = ttl.ToString();
            properties.SetPersistent(true);

            // Publish the actual message on the specified queue
            _channel.BasicPublish("", _queue, properties, body);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.StackTrace);
        }

        return false;
    }

我可以使用返回properties.IsExpirationPresent()的{​​{1}}来检查过期是否已设置。但是,如果我检查有关队列的高级信息(通过管理插件),我看到队列中有true个消息已发布,即使TTL已经过去(30秒),队列仍然将它们设为N

是否应该在TTL过期时从队列中删除它们,还是在队列中看到它们是否正常?

1 个答案:

答案 0 :(得分:4)

您可以同时设置Per-Queue Message TTL和个人Per-Message TTL。如果两者都设置,将使用最短的一个。已过期TTL的消息在到达队列时从队列中删除(有关详细信息,请参阅Caveats部分)。

此外,来自another answer about TTL in RabbitMQ

  

具有过期ttl的邮件将保留在队列中,只要它们没有到达队列头。别担心,他们不会被发送给消费者,但是他们会占用一些资源直到他们达到目标。这就是RabbitMQ队列的工作方式(它们坚持FIFO理念,有时可能会破坏与AMQP协议的严格兼容性)。有关详情,请参阅Caveats section in Time-To-Live Extensions