Camel运行原理分析
Camel运行原理分析
以一个简单的例子说明一下camel的运行原理,例子本身很简单,目的就是将一个目录下的文件搬运到另一个文件夹,处理器只是将文件(限于文本文件)的内容打印到控制台,首先代码如下:
|
public static void main(String[] args) throws Exception { //创建Camel上下文 DefaultCamelContext camelContext = new DefaultCamelContext(); //添加一个路由,参数为路由建造者 camelContext.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { this.from("file:D:/temp/in").process(new Processor() { @Override public void process(Exchange exchange) throws Exception { GenericFile<File> gf = exchange.getIn().getBody(GenericFile.class); File file = gf.getFile(); PrintStream ps = new PrintStream(System.out); BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); String line = null; while((line=br.readLine())!=null) { ps.println(line); } ps.close(); br.close(); } }).to("file:D:/temp/out"); } }); //启动上下文 camelContext.start(); //防止主线程退出 Object object = new Object(); synchronized (object) { object.wait(); } } |
对于camel来说,其原理核心的部分主要包含路由信息的构建、组件查找、和路由启动过程三方面,下面结合以上简单例子对三个方面来对camel的源码进行分析:
一、路由的构建
其实这里说的路由构建其实是构建路由定义,对应Camel中的RouteDefinition类,一个RouteDefinition对象规定了或者说指定了一个消息从哪里产生,中间要经过什么样的处理,最后路由到什么地方。RouteDefinition由RouteBuilder进行构建,再具体点就是调用RouteBuilder的configure()方法,构建完成后再添加到CamelContext中,那么该路由定义就可以运行了。RouteBuilder的configure()方法是一个抽象方法,所以该方法要由开发者进行实现,其实就是在进行路由定义的构建过程。
首先,调用RouteBuilder的from方法获取RouteDefinition,并且根据from传入的参数将一个FromDefinition类型的实例设置给RouteDefinition的inputs(输入)列表,然后调用RouteDefinition的process()和to()方法,分别生成ProcessDefinition和ToDefinition对象,因为ProcessDefinition和ToDefinition都继承自ProcessorDefinition,所以都可以看出输出放到RouteDefinition的outputs(输出)列表中,至此,整个路由定义就构建完成了,其实该路由定义最重要的就是输入与输出,输入与输出都可以有多个,默认情况下,在路由运行后,Camel会依赖调用这些输出处理器并最终将消息路由到指定目的地。
二、组件查找方式
Camel的运行是由组件(component)进行组织的,我们前面的调用from()方法传个字符串,camel是要根据uri来查找到对应的组件,即要维护uri到组件之间的映射关系,查找组件的过程是调用DefaultCamelContext中的getComponent(String name)方法来完成的,是在DefaultCamelContext启动的时候调用,获取相应的组件,生成对应的endPoint,组件的查找是从DefaultCamelContext上下文缓存的components中去找,如果没有找到,就会去根据uri前缀生成一个component,生成的代码大致如下:
|
// 先在注册表中查找 Object bean = null; try { bean = context.getRegistry().lookupByName(name); getLog().debug("Found component: {} in registry: {}", name, bean); } catch (Exception e) { getLog().debug("Ignored error looking up bean: " + name, e); } //省略了一部分代码.... // 注册表中没有时,使用Component工厂创建一个 Class<?> type; try { type = findComponent(name, context); if (type == null) { // not found return null; } } catch (NoFactoryAvailableException e) { return null; } catch (Exception e) { throw new IllegalArgumentException("Invalid URI, no Component registered for scheme: " + name, e); } // 创建Component if (Component.class.isAssignableFrom(type)) { return (Component) context.getInjector().newInstance(type); } else { throw new IllegalArgumentException("Type is not a Component implementation. Found: " + type.getName()); } |
其中的findComponent方法是在camel包中默认路径META-INF/services/org/apache/camel/component/+uri前缀名
找对应的Properties(不带.properties后缀)文件,文件中有Component组件实例化的类名,找到后通过反射机制生成一个component组件,放到缓存中。我们自己也可以按照这个规则来拓展自己的component。
三、路由的启动原理

Camel启动原理图
四、路由的运行原理

图一

图二
Camel运行原理分析的更多相关文章
- tensorflow运行原理分析(源码)
tensorflow运行原理分析(源码) https://pan.baidu.com/s/1GJzQg0QgS93rfsqtIMURSA
- 【Java编程实战】Metasploit_Java后门运行原理分析以及实现源码级免杀与JRE精简化
QQ:3496925334 文章作者:MG1937 CNBLOG博客ID:ALDYS4 未经许可,禁止转载 某日午睡,迷迷糊糊梦到Metasploit里有个Java平台的远控载荷,梦醒后,打开虚拟机, ...
- browserify运行原理分析
目前对于前端工程师而言,如果只针对浏览器编写代码,那么很简单,只需要在页面的script脚本中引入所用js就可以了. 但是某些情况下,我们可能需要在服务端也跑一套类似的逻辑代码,考虑如下这些情景(以n ...
- Java程序运行原理分析
class文件内容 class文件包含Java程序执行的字节码 数据严格按照格式紧凑排列在class文件的二进制流,中间无分割符 文件开头有一个0xcafebabe(16进制)特殊的标志 JVM运行时 ...
- springboot创建,自动装配原理分析,run方法启动
使用IDEA快速创建一个springboot项目 创建Spring Initializr,然后一直下一步下一步直至完成 选择web,表示创建web项目 运行原理分析 我们先来看看pom.xml文件 核 ...
- 老李推荐:第5章7节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles
老李推荐:第5章7节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles poptest是国内唯一一家培养测试开 ...
- 老李推荐:第5章6节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 初始化事件源
老李推荐:第5章6节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 初始化事件源 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试 ...
- 老李推荐:第5章3节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动脚本
老李推荐:第5章3节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 启动脚本 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...
- 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用
老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionP ...
随机推荐
- Android开发学习笔记:Intent的简介以及属性的详解【转】
一.Intent的介绍 Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述 ...
- AXUre
[ Javascript ] 一.javascript能用来干什么? 1.数据的验证. 2.对动态这本写到网页当中. 3.可以对事件做出响应. 4.可以读写html 中的内室. 5.可以检测浏览器 6 ...
- SQL Server简单语句/待整理
数据库对象:表Table,视图View,存储过程Stored Procedure,触发器Trigger 关系:1关系=1二维表,1关系有1关系名.1关系=1表对象 属性/字段: 二维表中垂直方向的列 ...
- 使用 UnrealPak.exe 创建 Pak文件方法
看来各位摸UE4 的基佬们,也是被DLC搞得不要不要的呢,其实热更新PAK是很简单就可以实现的,虽然当时我也是弄了快一个月. 下面贴一段以前在 Runtime 状态下 Mount Pak的代码,希望能 ...
- ORACLE存储过程学习
存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE ...
- spring 包下载地址
留着,以备不时之需: http://repo.spring.io/libs-release-local/org/springframework/spring/
- nginx做nodejs(express等通用)反向代理
首先配置环境nginx+nodejs...(没有请看我的其他文章,此处不重复) cd 到nginx的site-available目录 ubuntu的在 cd /etc/nginx/site-avail ...
- Rally的敏捷小册子
来自为知笔记(Wiz)
- discuz不能发表投票、附件上传等
如何开启和发表投票主题 本教程主要讲述如何开启和发表投票的帖子.具体的操作如下: 1.论坛后台 => 用户 => 用户组 => 详情 => 特殊主题 => 允许发起投票设 ...
- jQuery method and examples
一:介绍: jQuery:是DOM和js的封装.jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多).现在大多数的pc端的网站都 ...