我们使用 Tibco EMS
作为我们的消息传递系统,并使用 apache Camel
来编写我们的应用程序。在我们的应用程序中,消息被写入队列。 concurrentConsumers
设置为 8 的组件从队列中读取、处理消息,然后写入另一个队列。另一个组件再次将 concurrentConsumers 设置为 8,然后从这个新队列中读取数据,依此类推。到目前为止,维护消息顺序并不重要,但新的要求意味着现在变得重要了。查看camel文档,建议使用jmsxgroupid
来维护排序。遗憾的是,Tibco EMS
不提供此功能。还有其他方法可以在多线程应用程序中维护 Camel 的顺序吗?我研究过粘性负载平衡,但这似乎仅适用于端点负载平衡。
谢谢
布鲁斯
最佳答案
在企业集成领域,我们通常使用 Resequencer设计模式来解决此类问题,您需要确保消息中的顺序。
Apache Camel 涵盖了广泛的企业集成模式,包括其核心的 Resequencer,并且它对这些模式具有开箱即用的实现。所以你要找的应该是这样的:
http://camel.apache.org/resequencer.html
在您的具体情况下,您所需要做的就是向发送到 TIBCO EMS 的传出消息添加一个自定义消息 header (例如 myMessageNo
),该 header 具有指定顺序的序列号。然后,在消费者端,使用重排序器 EIP 恢复从 TIBCO EMS 传入消息的顺序。
但是,正如您所看到的,这并不像将重排序器 EIP 放入您的 Camel 路由那么简单。 (任何异步解决方案总是很难正确构建。)对于重排序器,您需要考虑悲伤路径何时发生,例如当一些消息丢失并且永远无法到达时。为了确保您的路由即使在这些特殊情况下也能正常工作,您需要从两个选项中进行选择:最大批量大小或超时。根据所选条件,当批处理达到最大大小或等待丢失消息超时时,重新排序器将刷新消息。
关于java - 维护多线程 Apache Camel 应用程序中的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46489362/