Camel JMS 确保在从死信通道取消边缘时进行排序

Posted

技术标签:

【中文标题】Camel JMS 确保在从死信通道取消边缘时进行排序【英文标题】:Camel JMS ensuring ordering when unsidelining from dead letter channel 【发布时间】:2014-07-31 01:46:36 【问题描述】:

我正在使用骆驼与 ActiveMQ JMS 集成。我正在接收此队列中产品的价格。我在 productId 上使用 JMSXGroupID 以确保跨 productId 进行排序。现在,如果我无法处理此消息,我会将其移至 DeadLetterQueue。这可能是因为依赖服务的连接错误或消息本身的错误。 如果是前者,我将不得不手动将其从 DLQ 中删除并将其放回 JMS 队列中。 现在的问题是我不知道该 groupId 上的任何其他消息是否已被接收和处理。因此,从 DLQ 取消边线会扰乱订单。另一方面,如果我不取消它并且没有收到其他消息,则产品 ID 将无法获得正确的价格。 我想到的 1 个解决方案是使用快速键值存储(Redis)来存储最后一个 messageId 或 JMSTimestamp 对 productId(消息组)。每次我将消息出列时都会更新。对此还有其他解决方案吗?

【问题讨论】:

【参考方案1】:

在 JMS 中依赖消息顺序是一项有风险的业务——充其量是。 最好的办法是让接收者作为特殊情况处理乱序消息(但在正常操作期间可能会利用消息顺序)。

您可能还想区分两个错误:位置消息和临时连接问题,甚至可能为它们使用两个不同的错误队列。如果是位置消息(无效的有效负载等),那么除了开始错误调查之外,您实际上无能为力。在这种情况下,您可能可以发送“其他内容”,例如不干扰订单的虚拟消息。

对于连接问题的问题,你可以有另一种策略——ActiveMQ Redelivery Policies。如果出现网络故障,在处理完第一条消息之前尝试处理第二条消息通常是没有用的。重新交付政策可确保(假设您只有一个消费者)。有another question at SO,发帖人实际上已经解决了您的问题并希望避免它。阅读。 :)

【讨论】:

以上是关于Camel JMS 确保在从死信通道取消边缘时进行排序的主要内容,如果未能解决你的问题,请参考以下文章

Camel 和 JMS 以正确的顺序从高级队列中消费消息

如何使用 Apache Camel 从 Java 类访问 JMS 队列?

Spring JMS 和 ActiveMQ 在哪里查看死信队列中的消息

Apache Camel JMS - 异常未通过请求/回复返回给调用者

使用 CoD over Camel JMS 组件实现本机 websphere MQ

如何在 Apache Camel 中检测损坏/恢复的 JMS 连接?