为什么 Channel.waitForConfirmsOrDie 不阻塞?

2024-01-24

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

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

根据javadocs http://www.rabbitmq.com/javadoc/com/rabbitmq/client/Channel.html#waitForConfirmsOrDie%28%29, waitForConfirmsOrDie 应该:

等到自上次调用以来发布的所有消息均已被代理确认或拒绝。如果任何消息被拒绝,waitForConfirmsOrDie 将抛出 IOException。当在非Confirm通道上调用时,会立即返回。

为了测试这个方法是否真的有效,我开始了此示例代码来自 RabbitMQ 网站 http://hg.rabbitmq.com/rabbitmq-java-client/raw-file/da241e35951b/test/src/com/rabbitmq/examples/ConfirmDontLoseMessages.java.

该示例代码创建了一个发布者和一个消费者,每个发布者和消费者都在自己单独的线程上。然后发布者将消息发送到交换器,而消费者则消费消息。看来发布者应该阻塞,直到通过调用 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 节点之一(甚至所有节点)发生故障/不可用,消息不会消失,而不通知产生。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Channel.waitForConfirmsOrDie 不阻塞? 的相关文章

随机推荐

  • 如何限制 NSTokenField 中的令牌数量?

    我有一个 NSTokenField 其中的令牌是在按 Enter 键时创建的 我想限制该字段中的令牌数量 举例来说 应该只允许用户依次输入 2 个令牌 之后 既不应该允许用户设置Token 也不应该允许用户进一步搜索 简而言之 用户应该在
  • 为什么通过 goto 向后移动时会调用析构函数[重复]

    这个问题在这里已经有答案了 可能的重复 会使用goto泄漏变量 https stackoverflow com questions 7334952 will using goto leak variables 在下面的例子中 当goto被称
  • 如何在 ASP.Net MVC 5 站点中设置 NameClaimType?

    我使用 Microsoft 的 本地 组织帐户身份验证机制创建了一个 ASP Net MVC 5 站点 这最终配置为指向我公司的 ADFS 基础设施 我正在取回所有配置的声明 但是 在运行时 ClaimsIdentity Name 为空 这
  • jquery .map 不适用于 IE 10

    我有这个 jquery 代码 tf zoom live click function var n tf thumbs find img attr src var modelid n substr 43 post models get gal
  • Dialogflow 实现 webhook url 支持自签名证书吗?

    我正在使用 Dialogflow 履行网络钩子来处理天气 Dialogflow 显示 启用 Google Assistant 集成后 您只能在履行网址中使用 https 所以 我尝试了 https url 的自签名证书 但我无法获得 web
  • 为 Telnet 会话创建脚本?

    有谁知道创建一个可以连接到 telnet 服务器的脚本的简单方法 执行一些常见的 telnet 操作 然后注销 我正在与不熟悉 telnet 及其需要运行的命令的用户打交道 我想要的只是让他们双击脚本 然后让该脚本自动为他们执行命令 您可能
  • 我可以在命令行上通过 xbuild 将参数传递给 msc 吗?

    xbuild 有没有办法通过命令行或构建脚本将附加参数传递给编译器 具体来说 我想通过 mcs debug 1获取堆栈跟踪内部编译器错误 https travis ci org libgit2 libgit2sharp builds 106
  • 如何将 SOAP 消息解析为 Jaxb 类

    我有一个 SOAPMessage 对象 我想将其解析并转换为一组 Jaxb 类 如何将消息转换为 Jaxb 可以解组的格式 javax xml bind Unmarshaller unmarshal SOAP 消息的正文包含实际数据及其要解
  • 如何在 CoreOS 的 Vagrant 虚拟机实例上运行 python?

    如何在 CoreOS 的 Vagrant 虚拟机实例上运行 python 我想访问 python 解释器 谢谢 您还可以安装python在 CoreOS 上使用下面的脚本 我们称之为install python sh bin bash e
  • PHP 联系表单在查看页面时发送空白电子邮件

    谁能帮助我阻止每次查看页面时发送空白电子邮件 这是我正在使用的代码
  • 指针减法不指向同一数组的不同元素在 C 中有效吗?

    指针减法不指向同一数组的不同元素在 C 中有效吗 下面的东西是否能保证按照 C 标准工作 我依稀记得读到这是无效的 int a int b a int 100 b int 200 printf d n b a 这会给我25吗 来自 C 规范
  • 剧作家按钮的点击效果不可预测

    我至少有三个选项可以单击按钮 await page Locator button new HasText ClickAsync await page GetByRole AriaRole Button new Name ClickAsync
  • jquery sortable 不能拖到手风琴之外

    我有 2 个相连的可排序列表 一个在手风琴里面 当我尝试从手风琴中的可排序项中拖动项目时 一旦我离开手风琴 助手就会消失 我可以拖放到其他连接的可排序项之一 该项目将显示 但在我拖动时它不会显示 如果我向下拖动项目 手风琴也会向下滚动 我可
  • Tensorflow2.0:GPU 在超参数调整循环期间内存不足

    我正在尝试对使用 GPU 扩展的 Tensorflow 2 0 编写的卷积神经网络进行一些超参数调整 我的系统设置是 Windows 10 64 位 GeForce RTX2070 8GB 张量流 2 0 测试版 CUDA 10 0正确安装
  • 如何在android中的同一个textview中显示粗体和普通文本?

    我搜索过互联网并尝试了以下代码 但它不起作用 SpannableString ss1 new SpannableString Health ss1 setSpan new android text style StyleSpan andro
  • 如何使用 Boost Hana 消除元编程递归

    我正在尝试根据发送到函数的类型创建一个位集 但让我们稍微减少一下测试用例 Warning 我在这个例子中使用自动 gcc 扩展 我不需要使用模板参数 该错误是由于使用手动递归导致的越界访问造成的 函数式编程的部分目的是提供结构来消除此类错误
  • 如何获取 Coldfusion 中的 URL 参数和值?

    如何获取 Coldfusion 中的 URL 参数和值 例如 我的网址是 test cfm par1 val1 par2 val2 par3 val3 是否可以直接获取第二个参数及其值 with
  • “git add --patch”包含新文件?

    当我跑步时git add p 有没有办法让 git 选择新制作的文件作为 hunk 来选择 所以如果我创建一个名为foo java 然后运行 git add p git 不会让我选择要添加到索引中的文件内容 当我尝试时git add p s
  • 如何将可观察列表转换为数组列表?爪哇

    我试图获取表视图中的所有项目并将它们放入数组列表中以进行进一步处理 这就是我想要实现的目标 但显然这是行不通的 ArrayList
  • 为什么 Channel.waitForConfirmsOrDie 不阻塞?

    我有一个发布 订阅用例 我想在发布端进行阻止 直到每个订阅者确认他们已完成处理发布者发送的消息 我 错误地 假设我可以使用 RabbitMQ 及其 Java amqp client 的 Channel waitForConfirmsOrDi