【问题标题】:Building Apache Camel Routes Dynamically动态构建 Apache Camel 路由
【发布时间】:2019-05-06 13:32:06
【问题描述】:

我正在开发一个应用程序,该应用程序使用 Apache Camel 将单个请求消息(输入)流过一些初始 Camel 组件/逻辑,然后流向多播,此时路由分支到多个分支。每个分支的目的是从特定的 Web 服务(或其他后端数据源,例如数据库)检索数据,然后在 Web 服务调用/数据检索操作完成后,每个分支将其输出数据转储到同一个通过自定义 bean 端点的方式。我预计最终会在 Camel 路线中拥有大约 40 个不同的分支,每个分支都可能流经一组不同的 Camel 组件,以准备其请求、提交请求、处理响应等……我预计公平分支的数量将非常相似(例如,所有 SOAP 调用非常相似,所有 REST 调用非常相似,等等),因此设计了一种方法,配置文件存储要调用/检索的后端数据源列表-以及定义(间接)到达每个来源的路线的能力。配置文件如下所示:

[a]
route=X + Y
Y.url=http://someservice

[b]
route=Z
Z.someproperty=123

然后我有代码读取该配置文件并将每个“部分”(例如“[a]”、“[b]”等)视为一个分支(即多播之外的目的地) 并依赖于动态实例化的类(例如 XRouteSegment、YRouteSegment、ZRouteSegment),以便依次填充/定义其特定分支的路由。作为一些示例,我构建了 RouteSegment 辅助类,用于连接组件,例如 Velocity、CXF、CXF-RS,用于数据编组/解组等...基于配置文件中设置的属性。

就 Camel 上下文的初始化而言,它以一种相当典型的方式开始,使用单个 RouteBuilder 构建路由的第一部分直到多播。但随后我进入一个 for 循环并遍历配置文件中找到的所有源(例如“a”、“b”等),并为多播流向的每个源创建 seda 节点。然后我调用与给定源(例如 X + Y)关联的每个 RouteSegment 实例,并允许它们根据需要添加到 RouteDefinition(例如,从他们的 seda 起点开始)。然后回到我的“主要”RouteBuilder 中,我添加了一些最终路由/组件,这些路由/组件对于所有分支都是相同的(即强制每个分支通过同一个自定义 bean 存储其数据的逻辑)。

代码工作得很好,但我质疑这种方法是否过于矫枉过正和/或是否有一些我忽略的更简单/更清洁的方法。对于每个分支(除了路由的“主干”和“尾部”),我最好只使用单独的 Java 类(即 RouteBuilders)吗?我试图避免的是在所有这些类中有太多重复的逻辑/代码......例如20 个类都以几乎完全相同的方式从 SOAP Web 服务中提取数据。所以我使用像上面引用的“X”这样的 RouteSegment 实例作为可重用的简写,否则将是一系列不同的 Camel Java DSL 调用(例如 from/to/process/log/etc ... 带有参数来控制个别陈述的细节)。为了在运行时(例如在 for 循环中,或通过某种反射/发现过程(应用程序使用 Spring Boot 运行))?

提前感谢您提供/建议的任何想法,而我可能还没有想到/尝试过!

【问题讨论】:

  • 如果您要部署到 OSGI 容器,您可以仅使用普通属性创建新路由。我现在正在旅行,如果我得到改变,我会在这里发布链接。

标签: apache-camel


【解决方案1】:

我只是想补充一些我在您的描述中遗漏的主题。

如果我理解您的描述是正确的,那么通过多播调用的所有分支组件都不是真正的组件,而是在运行时构建 Camel 路由的一种构建块。 听起来它们不可测试且不可独立启动(但也许您只是没有解释这方面)。

如果您要构建单独的小组件(每个组件都有自己的 RouteBuilder),您将拥有类似于微服务架构的东西:单独开发和部署的小单元

由于您使用 Spring Boot,因此您拥有autodiscovery of Routes,因此它们是一种“可插拔”。这些组件也可以使用Camel routetests 等进行测试。

组件将是更加“静态”的小型独立项目。这也确保了您在处理组件时快速的开发往返

但是在您编写时,这可能会导致大量冗余代码。所以我想你必须决定什么对你来说更重要。

【讨论】:

  • 感谢您的反馈!我最终将各个分支重构为都从一个抽象的 RouteBuilder 派生,该 RouteBuilder 为每个分支定义了核心逻辑,然后针对每个分支的细节推迟到一个抽象方法(由具体/派生的分支实现实现)。
猜你喜欢
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多