我正在使用camel与ActiveMQ JMS集成。我收到此队列中的产品价格。我在productId上使用JMSXGroupID来确保在productId上进行排序。现在,如果我无法处理此消息,我将其移至DeadLetterQueue。这可能是因为依赖服务上的连接错误或者因为消息本身的错误。 在前者的情况下,我将不得不从DLQ手动删除它并将其放回JMS队列。 现在的问题是我不知道是否已收到和处理该groupId上的任何其他消息。因此,DLQ的不受欢迎将破坏订单。另一方面,如果我不明确它并且没有收到其他消息,则产品ID将无法获得正确的价格。 我想到的一个解决方案是使用快速键值存储(Redis)来存储针对productId(消息组)的最后一个messageId或JMSTimestamp。每次我出列消息时都会更新。还有其他任何解决方案吗?
答案 0 :(得分:0)
依赖于JMS中的消息顺序是一项风险很高的业务 - 充其量。 最好的办法是让接收者在特殊情况下不按顺序处理消息(但在正常操作期间可能会利用消息顺序)。
您可能还想区分两个错误:posion消息和临时连接问题,甚至可能为它们使用两个不同的错误队列。对于posion消息(无效的有效负载等),除了启动错误调查之外,没有什么可以真正做到的。在这种情况下,您可以发送"其他内容",例如虚拟消息,以免干扰订单。
对于连接问题,您可以采用其他策略 - ActiveMQ Redelivery Policies。如果存在网络故障,在处理第一条消息之前,通常不会尝试处理第二条消息。重新交付政策确保(假设您有一个消费者)。有another question at SO海报实际上可以解决您的问题,并希望避免它。阅读。 :)