避免 camel 在 RabbitMQ 宕机时发送消息到队列

Avoid camel from sending messages to queue when RabbitMQ is down

我对 RabbitMQ 和 Apache-Camel 还很陌生。 消息 bing 从接口(IMAP 等)中挑选出来并发送到队列以进行进一步处理。 我正在努力寻找一种解决方案,以避免在 RabbitMQ 关闭的情况下丢失消息。 避免消息通过骆驼路线发送到队列的最佳解决方案是什么?

我使用 Spring 骆驼版本 2.25.1 的 DSL。

提前致谢。

此类集成场景的问题是:当目标关闭时,在目标再次启动之前,您可以在哪里保存消息

因为您通常不可能保存数据,所以您别无选择,只能“将其推回源头”。

这通常是通过来自源的交易消费来完成的。您在事务中使用来自源的消息。当您可以处理消息并将其传送到目标时,您就在源事务上提交消息。从这一点开始,目标负责消息

如果您无法处理消息或目标已关闭,您可以回滚事务,以便源继续对消息负责

像这样您的集成永远不会对数据负责。消息要么停留在源上,要么到达目标。

所以,回到你的问题,你不需要避免向不可用的代理发送消息(你怎么能提前知道它已关闭?),但是如果发送失败(无论什么原因)原因),您应该确保消息不在源系统removed/committed上

下一步是处理重试场景,以避免在您的代理关闭时一遍又一遍地使用相同的消息。但这是一个全新的整合篇章。

在解释了基本原理之后,我必须补充一点在消息系统中,代理是系统的核心因此应该具有高可用性(集群,代理网络ETC)。所以考虑 broker-down-scenario 是非常好的,但这应该是一个非常罕见的边缘案例。

您可以将失败的消息写入文件。并且可以有另一条路线从文件中读取并发送到队列。您应该能够按需启动(在确保您的 jms 代理已启动并且 运行)