【发布时间】: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