我正在使用Apache Camel和ActiveMQ,并希望实现有保证的消息传递。
我一直在阅读Camel in Action一书以及Apache Camel Developer's Cookbook。
我希望有人可以在我的方法中告诉我。我不是要求代码样本。
我设想实施的方式如下:
1. Message is received on an endpoint
2. I inspect the message
3. I use the Wiretap pattern to drop it immediately on my "GuaranteedMessages" queue if the message asks for guaranteed delivery
4. I route the message to its proper destination
5. If no exceptions were encountered, I remove the message manually from the "GuaranteedMessages" queue
听起来很容易。但是,我一直在阅读“死信频道”#34;骆驼的图案。
我的理解是使用这种模式的实现意味着不是自动将每个(保证)消息丢弃到我的" GuaranteedMessages"队列,我放弃了这种方法,而是设置了重新传递选项(最大尝试次数,指数延迟,重新传递延迟等)。然后,我依靠Camel尝试重新发送,如果它永远不会通过,就会在死信通道延迟中将其丢弃。
然后,我会有一个单独的路由,使用这个死信队列作为它的来源。再次,它将是相同的模式。如果无法成功,请将消息发送回死信队列。
这听起来像生产系统的实际实现吗?
如果相反,我决定在我自己的" GuaranteeMessage"中删除每一条传入的消息(需要保证)。如果相信我以后可以从队列中手动删除该特定消息,那是否真实可行?我的理解是我必须手动浏览队列,遍历任意数量的消息,然后手动使用该消息。我不确定这样的架构是如何可扩展的。
答案 0 :(得分:1)
据推测,最终目的地不是另一个ActiveMQ队列,它可以通过异常。您对窃听的想法在功能上与使用DLQ相同,因此您可以使用Camel功能,它可以正常工作。
但是,有两点。首先,我会使用显式队列来保存需要重试的消息,而不是DLQ,因为每个代理只有一个DLQ,并且您不希望出现任何意外的其他消息。其次,如果您只是从重试队列中获取消息并重新提交,那么为什么不增加重试次数和延迟Camel异常处理?这样,您的重试队列只会包含可能需要手动干预的消息。因此,当消息在重试队列中时,您手动检查/修复任何潜在原因,并手动将消息移动到输入队列。