版本:Camel 1.0
camel-core test:
- org.apache.camel.processor.TransformViaDSLTest
- org.apache.camel.processor.TransformTest
小结:
- Camel解析Route、启动CamelContext、执行发送消息的基本过程
- 使用面向对象的特点解决语言定义、语言执行之间的关系。
- 内部类的使用。
- 职责链设计模式的应用。
配置一个简单的路由:
new RouteBuilder() {
public void configure() {from("direct:start").to("mock:result");
}
- 解析Route
- 在CamelContext增加Routes(调用 addRoutes方法,实质上是增加所有的FromBuilder为起点的Route),RouteBuilder将通过getRouteList()方法解析所有的Route(Returns the routing map from inbound endpoints to processors)。
- 构造FromBuilder:
- 加载direct:start所属于的DirectEndpoint。
- 通过direct模式,加载direct对应的Component;立即尝试启动Component,但DirectComponent。
- 没有实现Service接口(肯定有其他类型的Component需要启动);将加载后的Component设置在CamelContext的成员变量中,下一次将不重复创建DirectComponent。
- 通过DirectComponent创建direct:start EndPoint;立即尝试启动EndPoint,但DirectEndPoint没有实现Service接口(肯定有其他类型的EndPoint需要启动);将加载后的Component设置在CamelContext的成员变量中,下一次将不重复创建direct:start EndPoint。
- 通过DirectEndpoint构造FromBuilder。FromBuilder关键成员变量:
- from:Endpoint,即direct:start
- processors:此时为空
- processFactories:此时为空,下一步的ToBuilder为其成员
- 通过FromBuilder的to方法,构造ToBuilder;to方法返回ProcessorFactory
- 加载mock:result所属于的MockEndpoint,过程同上。
- 通过MockEndpoint构造ToBuilder。ToBuilder的关键成员变量:
- destination:Endpoint:即mock:result
- 将ToBuilder加入到FromBuilder的processFactories之中。
- 遍历RouteBuilder中的FromBuilder并createRoute(),并增加到RoutBuilder的routes中
- 遍历调用FromBuilder的processFactories,创建processor;
- 此时processFactories为ToBuilder将创建SendProcessor,其中SendProcessor的destination为mock:result;
- 为SendProcessor包装error handler:通过DeadLetterChannelBuilder创建processor为RecipientList(log:org.apache.camel.DeadLetterChannel:error);最终的包装为DeadLetterChannel。
- 如果processFactories产生多个processor,则构造CompositeProcessor,此时只有一个SendProcessor;
- 通过direct:start以及DeadLetterChannel构造EventDrivenConsumerRoute,返回。
- 启动CamelContext
- 遍历所有的Component,如果实现了Service方法,则进行启动;此时CamelContext有2个Component:DirectComponet和MockComponet。DirectComponet没有实现Service接口,MockComponet进行了实现,但方法为空。
- 遍历所有的route的Servcie并启动,此时为通过direct:start构造的FromBuilder而来的EventDrivenConsumerRoute。
- 获取EventDrivenConsumerRoute所包含的Servcie
- 获取EventDrivenConsumerRoute对应的processor,如果processor实现了Service接口,则加入列表;此例为DeadLetterChannel,DeadLetterChannel实现了Service接口,需要加入。
- 获取EventDrivenConsumerRoute对应的endpoint为direct:start,根据上一步的processor创建Consumer。Consumer接口继承了Service。一定加入。
- 启动Service,启动前将这些Service加入到CamelContext需要关闭的服务列表中
- 启动DeadLetterChannel
- 调用output:Processor的启动方法:调用SendProcessor的启动方法,SendProcessor启动调用destination的成员变量MockEndPoint的createProducer()方法。
- 调用deadLetter:Processor的启动方法:RecipientList实现了Service接口,进行启动(实现为空)。
- 启动Consumer on DirectEndpoint:将该Consumer增加到DirectEndpoint的Consumer列表中。
//Send a message,see ContextTestSupport.java
template.send("direct:start", new Processor() {
public void process(Exchange exchange) {
Message in = exchange.getIn();
in.setBody(body);
in.setHeader("testCase", getName());
}
});
- 在CamelContext中获取direct:start对应的EndPoint,并设置到CamelTemplate的缓存endpointCache中。
- 通过ProducerCache进行send(endpoint,processor)
- ProducerCache不包含direct:start的Producer,调用DirectEndipoint进行创建;并进行启动(实现为空)。将Producer设置到ProducerCache中。
- 调用Producer的createExchange方法:调用DirectEndpoint的createExchange方法,创建默认的DefaultExchange.
- 调用processor的process(defaultExchange)方法。
- 调用配置中的方法,即设置名为testCase的header.
- 调用Producer的process(defaultExchange)方法。
- 调用Producer on DirectEndpoint的process方法
- 调用DirectEndpoint的process方法
- 依次调用consumer.getProcessor.process(Exchange)方法
- DirectEndpoint唯一一个consumer为DeadLetterChannel,调用其process方法
- 调用output:SendProcessor的process方法
- 调用producer on SendProcessor的process方法
- producer的实现为DefaultProducer on MockEndpoint,调用MockEndpoint的process方法
-----------------------------------------------------------------------------------------------------------------------------------
若Route定义为:
from("direct:start").process(new Processor() {
public void process(Exchange exchange) {
Message in = exchange.getIn();
in.setBody(in.getBody(String.class) + " World!");
}
}).to("mock:result");
则向FromBuilder增加两个ProcessBuilder:
- addProcessBuilder(new ConstantProcessorBuilder(processor));
- ToBuilder answer = new ToBuilder(this, endpoint);
addProcessBuilder(answer);
在makeProcessor时通过上述两个Builder产生的processor构造成new CompositeProcessor
若Route定义为:
from("direct:start").setBody(body().append(" World!")).to("mock:result");
则向FromBuilder增加两个ProcessBuilder:
- addProcessorBuilder(ProcessorBuilder.setBody(expression));
- ToBuilder answer = new ToBuilder(this, endpoint);
addProcessBuilder(answer);
在makeProcessor时通过上述两个Builder产生的processor构造成new CompositeProcessor
在执行阶段,CompositeProcessor遍历执行两个processor。
-------------------------------------------------------------------------------------------------
Camel 1.1、1.3、1.4对上述过程有较大变动。
分享到:
相关推荐
### Apache Camel 在行动 #### 一、Apache Camel 概述 Apache Camel 是一个强大的 Java 框架,它使得开发者能够轻松地实现企业级集成模式。通过简洁而强大的领域特定语言(DSL),开发者可以像拼接乐高积木一样将...
1. **Camel简介** Apache Camel 的设计灵感来源于Enterprise Integration Patterns (EIP),它提供了一个模型来描述如何在不同的系统之间传输数据。Camel的核心组件是路由规则(Routes),这些规则定义了消息如何从...
在MATLAB编程环境中,"Camel3Camel6函数"是指用于特定数学计算或数据分析的一系列函数。这些函数可能涉及到曲线拟合、数值优化、数据处理等应用,尤其是在处理涉及非线性问题时,比如模拟生物体的驼峰形状、物理学中...
### Apache Camel 实战知识点概述 #### 一、Apache Camel 简介 - **定义**:Apache Camel 是一个强大的开源框架,它使开发者能够轻松地实现企业级集成模式(Enterprise Integration Patterns, EIP)。该框架提供了...
1. **Apache Camel 概述**: Apache Camel 提供了一个丰富的组件库,涵盖了各种协议和数据格式,如HTTP、FTP、JMS、MQTT、XML和JSON等。通过使用简单的DSL(Domain Specific Language)或Java API,开发者可以构建...
1. **DSL与路由定义**:Apache Camel支持多种DSL,如Java、XML和Groovy等,用于定义路由规则。例如,你可以使用`from()`方法指定消息来源,`to()`方法定义目标,中间可以用`process()`,`transform()`,`filter()`等...
" Camel In Action 中文版第一章知识点" 本章节将对 Camel 框架进行介绍, Camel 是一个开源的一体化框架,其目的是使一体化系统更容易。本书的第一章节我们将介绍 Camel 及展示它适合大企事业单位的软件。你将会...
### Camel in Action – Chapter 1: Meet Camel #### 一、引言 《Camel in Action》这本书旨在为读者提供Apache Camel框架的深入理解和实践指南。本书分为三个部分:第一部分介绍初学者需要了解的基本概念;第二...
1. **纯Java调用**: 通过在Camel的`Processor`接口实现类中直接调用bean的方法。 2. **Spring XML配置**: 在Spring XML配置文件中配置bean的调用逻辑。 ##### 4.1 使用bean的复杂方式 **纯Java调用**: 通过自定义`...
《Camel in Action》是关于Apache Camel这一企业级集成框架的专业书籍,这本书深入浅出地讲解了如何使用Camel构建高效、可维护的集成解决方案。PDF版本提供了方便的电子阅读体验,而源代码则帮助读者更好地理解书中...
1. Apache Camel 概述 Apache Camel 是一个开源框架,提供了一个统一的方式来集成多种协议、传输和数据格式的应用程序。它支持多种协议,例如 HTTP、FTP、JMS、MQTT 等,能够帮助开发者快速构建企业应用集成系统。 ...
1. **灵活的消息路由:** Camel 提供了一种基于领域特定语言(DSL)的路由机制,允许开发者以声明式的方式定义消息的流向。 2. **丰富的集成组件:** Camel 内置了大量的组件,支持各种协议和服务,如 HTTP、JMS、...
Apache Camel 是一个强大的开源集成框架,它允许开发者通过声明式的方式定义路由和转换数据流,使得构建企业级应用变得更加简单。Timer 组件是 Apache Camel 中的一个重要部分,它提供了定时触发事件的功能,类似于 ...
Apache Camel 是一个强大的开源企业集成库,它提供了一种声明式的方式来定义路由和转换数据,使得构建复杂的分布式系统变得更加简单。Camel 使用一种名为“DSL”(Domain Specific Language)的语法规则,允许开发者...
### CAMEL呼叫流程与信令流程详解 #### 概述 CAMEL(Customised Applications for Mobile network Enhanced Logic)是一种用于移动网络的智能网技术,它为移动运营商提供了定制化的增值服务功能。CAMEL主要应用于...
1. **错误处理**:Camel 提供了多种错误处理策略,如继续处理、重试、跳过或者停止。通过`onException`和`handled`等关键字,可以定制错误处理逻辑。 2. **并发处理**:Camel 支持多线程和并发,可以使用`...
#### 第一部分:初次接触Camel(第1章至第2章) - **第1章:遇见Camel** - **简介**:介绍Apache Camel的基础概念及其在企业级应用中的价值。 - **核心特性**:阐述Camel的主要功能和优势,包括其支持的各种协议...
1. **组件**:Apache Camel 包含了大量的预构建组件,如JDBC(Java Database Connectivity)用于与数据库交互,FTP/FTPS/SFTP用于文件传输,MQTT和AMQP用于消息队列,以及HTTP/HTTPS用于Web服务等。这些组件使得数据...
Apache Camel是一个基于已知企业集成模式的多功能开源集成框架。它提供了一种灵活的方式来定义路由和调解规则,支持多种特定领域的语言,包括基于Java的Fluent API、Spring或Blueprint XML配置文件以及Scala DSL。这...