从代码内部:骆驼路由引擎第一部分

因此,最近我重新燃起了对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进行更高级的链接。

参考:在Christian Posta – Software Blog博客上,使用我们的JCG合作伙伴 Christian Posta 使用k最近邻+遗传算法创建价格模型 。

翻译自: https://www.javacodegeeks.com/2013/08/from-inside-the-code-camel-routing-engine-part-i.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

各种推导式合集

推导式的套路 之前我们已经学习了最简单的列表推导式和生成器表达式。但是除此之外,其实还有字典推导式、集合推导式等等。 下面是一个以列表推导式为例的推导式详细格式,同样适用于其他推导式。 variable [out_exp_res for out_exp in input_list if o…

适用于高级Java开发人员的十大书籍

Java是当今最流行的编程语言之一。 有很多适合初学者的书籍。 但是对于那些使用Java进行过一段时间编程的人来说,其中有些人看起来有些简单和多余。 初学者的书没有带来新鲜有趣的想法。 但是,高级Java书籍并不总是一应俱全,部分原因是因为它…

Leetcode 456. 132 Pattern

题目的意思就是给你一个数组 里面一堆数,你是否能找到这样三个数,第一个数比第三个数小,第二个数最大。比如 1, 3, 2 或者 4, 9, 5 这种,数字可以不连续在一起,但是要保证顺序不变,只要有这么一组数就可以…

「起点订阅页」Checkbox 美化引发的蝴蝶效应

本文作者:任家乐 原创声明:本文为阅文前端团队 YFE 成员出品,请尊重原创,转载请联系公众号 (id: yuewen_YFE) 获取授权,并注明作者、出处和链接。 性能风暴 「据说亚马逊雨林的一只蝴蝶偶尔扇动几下翅膀,可…

python polar函数_Python可视化很简单,可是你会吗?python绘制饼图、极线图和气泡图,让我来教教你吧,一文教会!!!...

matplotlib库作为Python数据化可视化的最经典和最常用库,掌握了它就相当于学会了Python的数据化可视化,今天呢,咱们就一起来聊聊关于Python如何去绘制饼图、极线图和气泡图吧好啦,废话少说,咱们就开始吧!用…

Java中的访问者设计模式–示例教程

访客模式是行为设计模式之一 。 当我们必须对一组相似类型的对象执行操作时,将使用访问者模式。 借助访问者模式,我们可以将操作逻辑从对象移动到另一个类。 例如,假设有一个购物车,我们可以在其中添加不同类型的项目&#xff08…

函数递归与二分法

1.什么是函数递归 函数的递归调用是函数嵌套调用的一种特殊形式, 特殊在调用一个函数的过程中又直接或者间接地调用了该函数本身 递归本质就是一个循环的过程, 但是递归必须满足两个原则: 1.每进入下一层递归,问题的规模必须有所减…

使用Oracle WebLogic创建部署计划

创建部署计划 部署计划是JSR-88部署标准的一部分,尽管在该标准中未明确说明。 部署计划是一个XML文档,用于定义自定义WebLogic Server部署环境。 此配置可用于覆盖在应用程序归档文件中定义的特定设置。 有许多原因可能导致您不希望修改应用程序存档的原…

记录一个前端架构的想法

前端,真的是让我哭笑不得的职业,从几年前作为打酱油的理想职业到现在的热门职业,无疑在这个过程中,门槛变高了,而且还是非常高。一大堆的框架和库,像什么vue啦、react啦、angular啦、webpack啦等等等等。让…

java 编程原理_Java网络编程 -- 网络编程基础原理

Hello,今天记录下 Java网络编程 --> 网络编程基础原理。一起学习,一起进步。继续沉淀,慢慢强大。希望这文章对您有帮助。若有写的不好的地方,欢迎评论给建议哈!初写博客不久,我是杨展浩。这是我的第十五…

JavaScript基础之--- 深拷贝与浅拷贝

理解深拷贝和浅拷贝之前,先来看一下JavaScript的数据类型。 1、基本类型和引用类型 //案例1 var num1 1, num2 num1; console.log(num1) //1 console.log(num2) //1 num2 2; //修改num2 console.log(num1) //1 console.log(num2) //2 //案例2 var obj1 {x: 1, …

vue菜鸟从业记:完成项目最后一公里之真机测试和打包上线

最近我朋友王小闰他们公司的项目开发已经进入收尾阶段,前后端并行开发的差不多了,联调也调过了,上篇文章里也讲到了,所谓联调,就仿佛在说“我也不知道我的接口文档写的对不对,我们验证一下吧?我…

血淋淋的事实告诉你:你为什么不应该在JS文件中保存敏感信息

在JavaScript文件中存储敏感数据,不仅是一种错误的实践方式,而且还是一种非常危险的行为,长期以来大家都知道这一点。 而原因也非常简单,我们可以假设你为你的用户动态生成了一个包含API密钥的JavaScript文件: apiCall…

从零开始搭建一个vue.js的脚手架

在谷歌工作的时候,我们要做很多界面的原型,要求快速上手,灵活运用,当时用的一些现有框架,比如angular,太笨重了——尤雨溪(Vue.js 作者) vue.js是现在一个很火的前端框架&#xff0c…

更安全的Web通信HTTPS

1. HTTP协议存在的问题 阅读本篇需要对HTTP协议有最基本的了解。 借用《图解密码技术》里的图片,我们以如下一个购物场景开始介绍: 在网购过程中,如果使用纯粹的HTTP协议,那么用户的账号密码,信用卡,银行卡…

CSS入门指南——页面的水平居中

我们经常看到这样的网页,即内容水平居中在屏幕中间,左右留白。我们来给这样的布局起个名字——水平居中布局 其实要实现这样的布局十分简单,即给中间部分一个宽度,设置margin左右值为auto,如,中间部分class"main&…

mysql explain的使用

一、explain返回各列的含义: 1、table:显示这一行的数据是关于那张表的 2、type:重要的列,显示连接使用了何种类型,从最好到最差的连接类型为const、eq_reg、ref、range、index、ALL 3、possible_keys:显示…

使用 Canvas 生成公众号头图

熟悉“前端晚自修”的朋友们应该知道,我们每期的头图除了上面的文字随着每期变动以外,几乎是一模一样的(因为太懒了~)。这个头图虽然丑了一点,但是也还说的过去,毕竟是我倾尽毕生艺术细胞拼出来的&#xff…

Flask mysql 模版传参_Flask渲染Jinja2模板和传参

### Flask渲染Jinja2模板和传参:1. 如何渲染模板:* 模板放在templates文件夹下* 从flask中导入render_template函数。* 在视图函数中,使用render_template函数,渲染模板。注意:只需要填写模板的名字,不需要…

08 Spring框架 AOP (一)

首先我们先来介绍一下AOP: AOP(Aspect Orient Programming),面向切面编程,是面向对象编程OOP的一种补充。 面向对象编程是从静态角度考虑程序的结构,面向切面编程是从动态的角度考虑程序运行过程。 AOP底层…