Camel路由构建过程

个人认为Camel中最重要的两大块,一是路由的构建过程,二是路由构建完成后的执行过程。

下面就参数前面的Camel示例来说说路由的构建细节。

其实这里说的路由构建其实是构建路由定义,对应Camel中的RouteDefinition类,一个RouteDefinition对象规定了或者说指定了一个消息从哪里产生,中间要经过什么样的处理,最后路由到什么地方。RouteDefinition有点类似java中的Class类,包含的都是一个元信息,外界则是参照这些元信息进行工作。RouteDefinition由RouteBuilder进行构建,再具体点就是调用RouteBuilder的configure()方法,构建完成后再添加到CamelContext中,那么该路由定义就可以运行了。RouteBuilder的configure()方法是一个抽象方法,所以该方法要由开发者进行实现,其实就是在进行路由定义的构建过程。下面是前面Camel示例中configure()中的代码:

camelContext.addRoutes(new RouteBuilder() {
	@Override
	public void configure() throws Exception {
		this.from("file:H:/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:H:/temp/out");
	}
});

路由定义的起始都是调用RouteBuilder的from方法,from方法有多个重载方法,一种是传入一个uri字符串,另一种是传入一个Endpoint对象,看到这种形式的重载就应该能想到,给定一个uri字符串最终肯定也是要获取一个Endpoint对象的,而在上一篇Camel查找组件方式中讲到Camel要根据uri解析出组件名称,再由组件名称查找出组件,在Camel中的重要概念中知道,组件其实是一个Endpoint工作,其作用就是创建出Endpoint对象的。到这里Camel根据uri字符串获取Endpoint对象这条线应该是通了的。

下面我们去看一个RouteBuilder的from(uri)方法,因为该方法用得最普遍:

public RouteDefinition from(String uri) {
	getRouteCollection().setCamelContext(getContext());
	RouteDefinition answer = getRouteCollection().from(uri);
	configureRoute(answer);
	return answer;
}

首先调用了getRouteCollection()方法,该方法返回一个RoutesDefinition对象,该对象代表的是多个路由定义的集合,因为Camel中可以运行多个路由定义。然后将CamelContext对象设置到RoutesDefinition中,然后调用RoutesDefinition的from(uri)方法:

public RouteDefinition from(String uri) {
	//创建RouteDefinition对象
	RouteDefinition route = createRoute();
	route.from(uri);
	return route(route);
}
protected RouteDefinition createRoute() {
	//创建RouteDefinition对象
    RouteDefinition route = new RouteDefinition();
    ErrorHandlerFactory handler = getErrorHandlerBuilder();
    if (handler != null) {//为RouteDefinition设置错误处理器
        route.setErrorHandlerBuilderIfNull(handler);
    }
    return route;
}

RouteDefinition创建出来后又调用了RouteDefinition的from(uri)方法:

public RouteDefinition from(String uri) {
	//创建一个FromDefinition对象,并将其添加到路由定义的输入当中
    getInputs().add(new FromDefinition(uri));
    //返回当前RouteDefinition对象
    return this;
}

在RouteDefinition的from(uri)方法调用完成后再调用RoutesDefinition的route方法:

public RouteDefinition route(RouteDefinition route) {
    //预处理RouteDefinition,设置一些异常处理器,拦截器等
    RouteDefinitionHelper.prepareRoute(getCamelContext(), route, getOnExceptions(), getIntercepts(), getInterceptFroms(),
            getInterceptSendTos(), getOnCompletions());
    //将预处理好的RouteDefinition添加到RouteDefinition集合当中,这样Camel就知道多了一个路由定义
    getRoutes().add(route);
    //标记该路由定义已处理好
    route.markPrepared();
    //返回当前的RouteDefinition对象
    return route;
}

RoutesDefinition的route方法调用完成后调用configureRoute方法,该方法只是为路由定义了设置了group属性值。

根据上面的分析,RouteBuilder的from方法就要是创建了一个RouteDefinition对象,并在该对象的输入中加入了一个FromDefinition对象,然后将该RouteDefinition对象添加进RoutesDefinition。

接下来调用了RouteDefinition的process方法,该定义定义在ProcessorDefinition类中,RouteDefinition从ProcessorDefinition继承到该方法,注意该方法的返回值为一泛型,该方法接收一个Processor类型参数:

public Type process(Processor processor) {
    ProcessDefinition answer = new ProcessDefinition(processor);
    addOutput(answer);
    //这时的this不是ProcessDefinition对象,而是RouteDefinition对象
    return (Type) this;
}

该方法很简单,创建出一个ProcessDefinition对象并添加进RouteDefinition的输出(outputs)中,最后返回RouteDefinition对象。

接下来调用RouteDefinition的to方法,该方法也是从从ProcessorDefinition继承而来,返回值也为一泛型:

public Type to(String uri) {
    addOutput(new ToDefinition(uri));
    return (Type) this;
}

该方法也很简单,创建一个ToDefinition对象并添加进RouteDefinition的输出(outputs)中。

至此,在这个简单示例中,整个路由定义就构建完成了,其实该路由定义最重要的就是输入与输出,输入与输出都可以有多个,默认情况下,在路由运行后,Camel会依赖调用这些输出处理器并最终将消息路由到指定目的地。

时间: 2024-12-23 17:58:23

Camel路由构建过程的相关文章

Camel路由启动过程--续

上篇Camel启动路由过程中讲到启动Consumer,调用了DefaultCamelContext.startService(service)方法,下面是方法源码: private void startService(Service service) throws Exception { if (service instanceof StartupListener) { StartupListener listener = (StartupListener) service; addStartu

Camel路由启动过程

路由启动由CamelContext的start()方法开始,在该方法中调用了super.start(),即调用父类ServiceSupport的start()方法,ServiceSupport的start()方法中调用了doStart()方法又回到CamelContext的doStart()方法,该方法中调用了doStartCamel()方法,在doStartCamel()方法中有两个最重要的方法:startRouteDefinitions()与doStartOrResumeRoutes()方法

项目构建之maven篇:2.HelloWorld项目构建过程

文件结构说明: 项目构建生命周期: 清理 编译 测试 打包 运行 部署 清理与编译 hello\pom.xml POM:Project Object Model,项目对象模型 pom.xml与ant的build.xml类似 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocat

一步一步跟我学习lucene(7)---lucene搜索之IndexSearcher构建过程

最近一直在写一步一步跟我学习lucene系列(http://blog.csdn.net/wuyinggui10000/article/category/3173543),个人的博客也收到了很多的访问量,谢谢大家的关注,这也是对我个人的一个激励,O(∩_∩)O哈哈~,个人感觉在博客的编写过程中自己收获了很多,我会一直继续下去,在工作的过程中自己也会写出更多类似系列的博客,也算是对自己只是的一种积累: IndexSearcher 搜索引擎的构建分为索引内容和查询索引两个大方面,这里要介绍的是luce

ubuntu下stm32交叉工具链 构建过程1

说实话,这个过程将是十分折腾的过程,而且不一定成功,所以,我的很多朋友在听到我说要做这件事情的时候,都给我泼冷水. 但是,我还是想努力,因为这次我是下决心,非要反微软到底. 就算这个过程再难——我脑海里经常闪现起 勇敢的心 里 华伦士 最后受尽极性 仍然高喊 自由的情景. 我对自己说,也是激励自己:只有这样的人才有权利追求和获得自由. 这件事,难就难在我发现我光是为了获取一个可用的gcc编译器,在codesourcery codebench上下载下来都这么费劲. 我的网络速度相当快,但不知为什么

Maven学习总结(二)——Maven项目构建过程练习

Maven学习总结(二)——Maven项目构建过程练习 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项目的过程 一.创建Maven项目 1.1.建立Hello项目 1.首先建立Hello项目,同时建立Maven约定的目录结构和pom.xml文件 Hello | --src | -----main | ----------java | ----------resources | -----test | ---------java | -----

Saiku3.1构建过程(暂时不包含Saiku-UI)

1.首先下载Saiku3.1的源码:https://github.com/OSBI/saiku/tree/release-3.1 2.以maven项目方式导入到eclipse中(此步骤可以不做) 3.修改下载的根目录中的pom文件,找到build节点-->pluginManagement节点-->plugins中添加如下代码 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId

redis集群构建过程 linux windows

redis集群的构建过程 本人初次构建redis集群时,通过查阅资料整理的文档 目录 Linux Redis cluster集群方案... 1 Windows redis集群方案... 5 Linux Redis cluster集群方案 1 安装: 下载地址:http://download.redis.io/releases/ 下载版本:redis3.0.7.tar.gz [[email protected] soft]$ tar -zxzf redis-3.0.7.tar.gz [[email

【龙书笔记】编译器简介及程序构建过程综述

备注:本文是近期重新阅读编译器经典教材<Compilers Principles, Techniques, & Tools>一书(又称DragonBook,龙书)的其中一篇读书笔记. 1. 什么是编译器 从本质来看,平时提到的"编程语言"其实都是一些助记符,用于向其他人或机器描述我们想要完成的逻辑运算.这些易于人类理解的语言想要被计算机理解并正确执行,就必须被转换成机器码,而完成这一转换过程的软件系统就是编译器. 简言之,编译器其实也是一个计算机程序,它可以读取用一