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