我想设置一个超时,之后出列的消息会自动被NACK。
当我将消息出列时,我等到它被转移到套接字上,而另一方确认其接收。
我是否需要保留计时器列表,还是RMQ可以自动处理?
private void Run()
{
_rmqConnection = _queueConnectionFactory.CreateFactory().CreateConnection();
_rmqReadchannel = _rmqConnection.CreateModel();
_rmqReadchannel.QueueDeclare(QueueIdOutgoing(), true, false, false, null);
_rmqReadchannel.BasicQos(0, 1, false);
var consumer = new QueueingBasicConsumer(_rmqReadchannel);
_rmqReadchannel.BasicConsume(QueueIdOutgoing(), false, consumer);
while (true)
{
if (!_rmqReadchannel.IsOpen)
{
throw new Exception("Channel is closed");
}
var ea = consumer.Queue.Dequeue();
string jsonData = Encoding.UTF8.GetString(ea.Body);
if (OnOutgoingMessageReady != null)
{
OnOutgoingMessageReady(this, new QueueDataEventArgs(jsonData, ea.DeliveryTag));
}
//waiting for ACK from a different thread
}
}
答案 0 :(得分:18)
RabbitMQ不提供任何类型的超时机制来确认消息。这在official Python tutorial:
中讨论没有任何消息超时;只有当工作者连接死亡时,RabbitMQ才会重新传递消息。即使处理消息需要非常长的时间,也没关系。
Section 3.1.8 of the AMQP 0-9-1 specification描述了致谢,并且非常清楚它们可以是自动(客户端不需要做任何事情,消息一旦交付就会被确认)或者显式(客户端必须为已处理的每条消息或一组消息提供Ack)。
这是2009年的一些past discussion,确认情况确实如此。
所以:是的,如果你需要超时以在一段时间后自动发送NACK,你必须自己这样做。