因此,最近我重新燃起了对Apache Camel工作原理的兴趣。 Camel是一种功能强大的集成工具,用途非常广泛,但是只要我投入使用,我都会忍不住想:“嗯,这到底是怎么做到的!” …猜想我只是有一个诀窍,不只是接受它的美妙。我想知道为什么。
如果您过去一直关注我的一些文章,您会记得我确实有一篇博客文章,深入探讨了Camel DSL API的工作原理 。 更具体地说,您如何神奇地键入“ from(..)”,“ choice(..)”,“ simple(..)”等,并且DSL足够聪明,足以知道您的意思以及如何将所有内容串在一起。 如果您对所有操作方式都感兴趣,请在该帖子上花点时间。 请注意,其中有一些冗长而冗长的UML类图。
因此,如果您回想起前一篇文章,则DSL(无论是Java DSL,XML还是Scala或任何其他)都具有非常特殊的作用。 它可以帮助集成路线的作者非常清楚地表达自己的意图,然后将其构建为一个名为RouteDefinition的抽象。 RouteDefinition是您路线的“蓝图”,并且了解您所有的处理器 , EIP和组件 。 您可以考虑从(..)调用的任何时间是新RouteDefinition的开始。 其余路线赋予其形状。 因此,对于每个from(..),都有一个到RouteDefinition的一对一映射。
因此,当CamelContext启动时,它将收集所有RouteDefinition并开始从它们中构建一条路由。 看一下DefaultCamelContext#doStartCamel作为所有这些的入口点。 除其他重要事项外,例如将注册表,端点,启动基本服务,管理等放在一起,您将看到对DefaultCamelContext#startRouteDefinitions的调用。 这告诉RouteDefinitions构建Route对象,即路由交换的实际使用者(输入)+处理器(输出)的管道 。
下一个方框将详细介绍这一切的工作原理。 就像以前有关Camel内部工作的博客文章一样,这个细节主要是给我的:即,将来当我忘记了一半的时候,我想复习一下。 一些想为骆驼做贡献的人可能会发现这很有趣。 对于其他所有人。.随时跳过此块。
–开始详细部分–
DefaultCamelContext将遍历每个RouteDefinition ,并将尝试构建Route S和RouteContext S的列表。
快速绕道:
什么是RouteContext ? 简单来说,您可以将其视为Route的大脑,以及路由特定配置所处的地方(流缓存,跟踪,处理故障等)。 它了解“来自”消费者,管道的其余部分,拦截策略,路由策略,并能够构造将在交换机上运行的Route。
这可能会造成混淆,因为在实际上它们正在构建RouteContext和构建Route时,有许多名为“ addRoutes()”的方法的调用。 但是,将其放在一边。 因此,对RouteDefinition#addRoutes(..)的调用将返回RouteContext对象的列表。 它还将填充(最初为空)路由的列表。 这里的重数基本上是n到n。 因为您可以有多个RouteDefinition 输入 (例如,通过将多个from(..)。from(..)串在一起),所以可以预期到路由的单个1-to-1 RouteContext,以及一对PER from( )。 因此,在前面的示例中,列表中将有两个RouteContext和两个Route。 在对addRoutes(..)的调用中,它还会尝试将输出定义转换为真实的Processors。 处理器是Route对象的基础。 每个处理器都是基于其各自的定义(例如ChoiceDefinition,LogDefinition)构建的,但最终被包装在Channel对象中并添加到RouteContext中。
因此,总结一下, RouteDefinition将创建Route,RouteContext,并将各个输出定义转换为Processors。 创建这些路由后,将根据新创建的Route + RouteContext对创建一个RouteService ,并使用CamelContext建立该路由服务,以便稍后启动和控制路由的生命周期。
–结束详细部分–
因此,…一旦初始化了RouteService ,就需要启动路由,这取决于它们是否自动启动以及它们的顺序。 再次看一下DefaultCamelContext#doStartCamel ,对底部的是对DefaultCamelContext#doStartOrResumeRoutes的调用。 这将遍历我们的RouteService S并为路线确定正确的启动顺序,然后启动它们。
路线分为两个阶段:
- 热身:在热身阶段,我们浏览所有路径并启动所有“输出”或处理器/设备。 骆驼要注意确保
首先发生这种情况是因为我们不希望在所有“输出”可用之前就让“输入”或使用者启动。 - 启动/恢复:启动使用者! 这是特定于端点/组件的。 例如,JMS使用者将开始侦听目的地。
注意,在生命周期的这些阶段的所有阶段,都有可以调用的回调,以便您可以插入此生命周期并添加自己的自定义启动代码以与应用程序协调。 看看Camel API中可用的回调类型LifecylceStrategy
那里有它。 这是将路由定义转换为实际路由然后启动的方式。
在第二部分中,我希望探讨如何将处理器链接在一起,包括使用AsyncProcessor进行更高级的链接。
翻译自: https://www.javacodegeeks.com/2013/08/from-inside-the-code-camel-routing-engine-part-i.html