使用 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客户端