【问题标题】:Guaranteed delivery with rabbitmq client Java API使用 rabbitmq 客户端 Java API 保证交付
【发布时间】:2010-10-12 09:29:50
【问题描述】:

我想知道处理沟通的最佳方式是什么 错误(例如,RabbitMQ 崩溃或网络问题),使用 java API。

我们使用Channel.basicPublish(...) 方法,我们希望 保证我们发送给代理的每条消息的交付。

更具体地说,Java客户端发布中是否有机制 API(在消息发送到总线之前)确保 消息将被传递(或当总线发送一个回调调用 IOException) 还是我们必须实施这个过程?

你会怎么做?

【问题讨论】:

  • 您好,您使用的是什么 API 版本?谢谢
  • 谢谢你的建议,是的,我知道事务可能是一个答案,但我不想使用这种“沉重”的方式。我们刚刚实现了一个 ShutdownListener,然后我们在队列中缓冲消息,并尝试重新建立连接。当连接正常时,我们发送排队的消息。

标签: java rabbitmq


【解决方案1】:

您可以在代理上订阅自己的消息,这似乎过于复杂。正如this answer by Simon MacMullen in the RabbitMQ mailing list 所述(从OP 的问题移至此答案)transactions 是一个选项。:

目前,您可以保证发布已完成的唯一方法 through 是在一个事务里面发布——当事务 提交完成消息在磁盘上(假设持久队列/ 持久消息)。这虽然有点重量级。在里面 未来我们打算引入流媒体发布者 ACK 来做同样的事情 以更异步的方式工作。

然而,自从有了这个答案,一些新的选项以 Lightweight Publisher Confirms 的形式提供。官方文档中有关于“重”事务方法的示例,并且较新的流式发布者确认:

https://www.rabbitmq.com/blog/2011/02/10/introducing-publisher-confirms/

【讨论】:

  • 我建议说明这最初是由 OP 作为他们问题的一部分发布的,您将其移至答案。
  • @Kerooker 不确定 SO 中是否欢迎这种类型的归属,我会说不......但由于这只是一个小评论,我同意你的建议
【解决方案2】:

在 RabbitMQ 中有一个方法 channel.basicAck() 可以确认消息。

【讨论】:

  • 您的解决方案是针对不同的问题;他想知道如何确保他的 basicPublish 调用成功,而不是如何告诉 rabbitMQ 他已经处理了一条消息,以便可以安全地从消息队列中删除它。
猜你喜欢
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2020-09-05
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多