动态构建Apache骆驼路线

时间:2018-12-05 03:01:08

标签: apache-camel

我正在开发一个使用Apache Camel的应用程序,该应用程序将单个请求消息(输入)通过一些初始的Camel组件/逻辑,然后传递给多播,此时路由会分支到多个分支中。每个分支的目的是从特定的Web服务(或其他后端数据源,例如数据库)检索数据,然后在Web服务调用/数据检索操作完成后,每个分支将其输出数据转储到相同的位置。通过自定义bean端点的方式。我希望最终在骆驼路线中大约有40个不同的分支机构,每个分支机构可能会流过不同的骆驼组件集,以准备其请求,提交请求,处理响应等。分支的数量将非常相似(例如,所有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开始,该RouteBuilder构建了通往多播的路由的第一部分。但是随后,我进入一个for循环,并遍历配置文件中找到的所有源(例如“ a”,“ b”等),并为多播流向的每个源创建seda节点。然后我调用与给定源(例如X + Y)相关联的每个RouteSegment实例,并允许它们根据需要添加到RouteDefinition中(例如从其SEDA起点开始)。然后回到我的“主” RouteBuilder中,我对所有分支使用相同的最终路由/组件(即,迫使每个分支通过相同的自定义bean存储其数据的逻辑)。 / p>

代码工作得很好,但我在质疑这种方法是否过大和/或是否有一些我更容易做到的更简单/更干净的方法。我为每个分支(除了路由的“ trunk”和“ tails”之外)都设置单独的Java类(即RouteBuilders)会更好吗?我试图避免的是在所有这些类中都有太多重复的逻辑/代码...例如20个类都以几乎完全相同的方式从SOAP Web服务提取数据。因此,我正在使用上述“ X”之类的RouteSegment实例作为可重复使用的速记形式,否则它将是一系列不同的Camel Java DSL调用的序列(例如from / to / to / process / log / etc ...,其参数用于控制个别陈述的细节)。为了在运行时动态构建骆驼路线(+相当数量的分支)(例如在for循环内,或通过某种反射/发现过程(应用程序使用Spring Boot运行),是否应该考虑其他策略/方法? ))?

预先感谢您可能提供/建议的任何想法,而我可能尚未想到/尝试过!

1 个答案:

答案 0 :(得分:0)

我只想提出您描述中缺少的一些主题。

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

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

由于您使用的是Spring Boot,因此您拥有autodiscovery of Routes,因此它们可以“插入”。还可以使用Camel routetests等对组件进行测试。

这些组件将是更多的“静态”和小型独立项目。当您在组件上工作时,这还可以确保快速开发往返

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