使用 rabbitmq 客户端 Java API 保证交付

Posted

技术标签:

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

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

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

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

你会怎么做?

【问题讨论】:

您好,您使用的是什么 API 版本?谢谢 谢谢你的建议,是的,我知道事务可能是一个答案,但我不想使用这种“沉重”的方式。我们刚刚实现了一个 ShutdownListener,然后我们在队列中缓冲消息,并尝试重新建立连接。当连接正常时,我们发送排队的消息。 【参考方案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 他已经处理了一条消息,以便可以安全地从消息队列中删除它。

以上是关于使用 rabbitmq 客户端 Java API 保证交付的主要内容,如果未能解决你的问题,请参考以下文章

用于Rabbitmq Stomp的java websocket客户端

用于 Rabbitmq Stomp 的 java websocket 客户端

RabbitMQ研究Java-API使用

RabbitMQ Java客户端使用

009 客户端编码

Java SpringBoot集成RabbitMq实战和总结