是否有针对RabbitMQ消息的超时?

时间:2015-05-30 13:49:22

标签: c# rabbitmq

我想设置一个超时,之后出列的消息会自动被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
    }
}

1 个答案:

答案 0 :(得分:18)

RabbitMQ不提供任何类型的超时机制来确认消息。这在official Python tutorial

中讨论
  

没有任何消息超时;只有当工作者连接死亡时,RabbitMQ才会重新传递消息。即使处理消息需要非常长的时间,也没关系。

Section 3.1.8 of the AMQP 0-9-1 specification描述了致谢,并且非常清楚它们可以是自动(客户端不需要做任何事情,消息一旦交付就会被确认)或者显式(客户端必须为已处理的每条消息或一组消息提供Ack)。

这是2009年的一些past discussion,确认情况确实如此。

所以:是的,如果你需要超时以在一段时间后自动发送NACK,你必须自己这样做。