gpt4 book ai didi

rabbitmq - 为什么 Channel.waitForConfirmsOrDie 不阻塞?

转载 作者:行者123 更新时间:2023-12-02 18:59:34 24 4
gpt4 key购买 nike

我有一个发布-订阅用例,我想在发布端进行阻止,直到每个订阅者确认他们已完成处理发布者发送的消息。

我(错误地?)假设我可以使用 RabbitMQ 及其 Java amqp-client 的 Channel.waitForConfirmsOrDie 方法作为我的解决方案的一部分。问题是我还没有发现 waitForConfirmsOrDie 实际上会阻塞的情况。

根据javadocs , waitForConfirmsOrDie 应该:

Wait until all messages published since the last call have been either ack'd or nack'd by the broker. If any of the messages were nack'd, waitForConfirmsOrDie will throw an IOException. When called on a non-Confirm channel, it will return immediately.

为了测试这个方法是否真的有效,我从this example code from the RabbitMQ website开始。

示例代码创建了一个发布者和一个消费者,每个都在自己单独的线程上。然后发布者将消息发送到交换器,而消费者则消费消息。看来发布者应该阻塞,直到通过调用 waitForConfirmsOrDie() 确认所有消息为止。

这个示例代码似乎与我想要做的事情完美匹配。但是,它似乎并不像我想象的那样工作。事实上,如果我在消费者线程中关闭自动确认消息,那么 waitForConfirmsOrDie() 仍然会立即返回。

我通过将一个 false 更改为 true 来关闭自动确认:ch.queueDeclare(QUEUE_NAME, false, false, false, null);变成ch.queueDeclare(QUEUE_NAME, true, false, false, null); (第二个参数 false 而不是 true)。我相信这意味着消费者不应再发送确认。

那么 waitForConfirmsOrDie() 实际上做了什么?什么时候会阻塞?

如果 waitForConfirmsOrDie 没有执行我想要的操作,有没有办法让发布者等到所有订阅者都确认消息后再继续?

最佳答案

据我了解,这些电话不应等待消费者的确认。 waitForConfirms* 方法的目的是确保您的消息已传递给代理并提供基本的已传递/失败类型的通知。换句话说,如果 rmq 节点之一(甚至所有节点)发生故障/不可用,则消息不会消失而不通知生成。

如果您在 basicPublish 调用之前断开连接或关闭 rmq,则可以看到此异常正在发生。

关于rabbitmq - 为什么 Channel.waitForConfirmsOrDie 不阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13132512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com