我正在尝试将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过期时从队列中删除它们,还是在队列中看到它们是否正常?
答案 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。