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