java - 维护多线程 Apache Camel 应用程序中的顺序

标签 java multithreading apache-camel

我们使用 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/

相关文章:

java - 无法使 Struts2.2.1 注释在 Netbeans 6.9 上工作

java - 使用 ResponseEntity Spring MVC

java - 在 spring boot 中使用现有的 http 服务器作为 Camel 端点

java - 为什么java中的包命名开头有TLD

java - 自动将form String输入值动态转换为其他java类型生成类实例

c++ - 限制 Concurrency::parallel_for 中使用的线程数

java - 在线程 2 进入方法 2 后,向运行线程 1 发出信号以完成方法 1

c# - Dispatcher Invoke(...) 与 BeginInvoke(...) 混淆

apache-camel - Wildfly-Camel 12 中的 Groovy JsonBuilder 类加载错误

apache-camel - 如何处理 JMS 重新传递到我的 Camel Route,但仍然允许消息删除