我想设置一个超时时间,超过该超时时间后,出队的消息将自动被 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
}
}
是的。这在官方Python教程 https://rabbitmq.com/tutorials/tutorial-two-python.html:
消费者交付确认时强制执行超时(默认为 30 分钟)。这有助于检测从不确认交货的有问题(卡住)的消费者。
您可以在 RabbitMQ 文档中找到更多信息:传送确认超时 https://www.rabbitmq.com/consumers.html#acknowledgement-timeout
然而,情况并非总是如此。旧版本的 RabbitMQ(至少到版本 3.6.x)没有提供任何类型的超时机制来确认消息。这在旧版本的官方 Python 教程 http://previous.rabbitmq.com/v3_6_x/tutorials/tutorial-two-python.html:
没有任何消息超时;仅当工作连接断开时,RabbitMQ 才会重新发送消息。即使处理一条消息需要非常非常长的时间也没关系。
AMQP 0-9-1 规范第 3.1.8 节 https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf描述了致谢,并且非常清楚它们可以是自动的(客户端无需执行任何操作,消息一经传递就会被确认)或Explicit(客户端必须对其已处理的每条消息或一组消息进行 Ack)。
这是一些过去的讨论 http://rabbitmq.1065348.n5.nabble.com/adjusting-timeout-for-non-acked-messages-to-be-requeued-td10084.html从 2009 年开始就证实了这一行为。
我看到的第一个改变这种行为的参考是this PR https://github.com/rabbitmq/rabbitmq-server/pull/1972从 2019 年 4 月开始。我不确定该更改包含在哪个版本的服务器中,但听起来默认值最初是“无超时”,然后是 15 分钟RabbitMQ 3.8.15 https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.8.15,然后 30 分钟RabbitMQ 3.8.17 https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.8.17(截至 2021 年 10 月仍然如此)。
因此:此行为取决于您的 RabbitMQ 版本。旧版本要求您在一段时间后显式发送 NACK。较新的版本有默认超时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)