`
阅读更多

版本:Camel 1.0

 

camel-core test:

  1. org.apache.camel.processor.TransformViaDSLTest
  2. org.apache.camel.processor.TransformTest

小结:

  1. Camel解析Route、启动CamelContext、执行发送消息的基本过程
  2. 使用面向对象的特点解决语言定义、语言执行之间的关系。
  3. 内部类的使用。
  4. 职责链设计模式的应用。

 

配置一个简单的路由:

new RouteBuilder() {
			public void configure() {from("direct:start").to("mock:result");
}
  1. 解析Route
    1. 在CamelContext增加Routes(调用 addRoutes方法,实质上是增加所有的FromBuilder为起点的Route),RouteBuilder将通过getRouteList()方法解析所有的Route(Returns the routing map from inbound endpoints to processors)。
      1. 构造FromBuilder:
        1. 加载direct:start所属于的DirectEndpoint。
          1. 通过direct模式,加载direct对应的Component;立即尝试启动Component,但DirectComponent。
          2. 没有实现Service接口(肯定有其他类型的Component需要启动);将加载后的Component设置在CamelContext的成员变量中,下一次将不重复创建DirectComponent。
          3. 通过DirectComponent创建direct:start EndPoint;立即尝试启动EndPoint,但DirectEndPoint没有实现Service接口(肯定有其他类型的EndPoint需要启动);将加载后的Component设置在CamelContext的成员变量中,下一次将不重复创建direct:start EndPoint。
        2. 通过DirectEndpoint构造FromBuilder。FromBuilder关键成员变量:
          1. from:Endpoint,即direct:start
          2. processors:此时为空
          3. processFactories:此时为空,下一步的ToBuilder为其成员
      2. 通过FromBuilder的to方法,构造ToBuilder;to方法返回ProcessorFactory
        1. 加载mock:result所属于的MockEndpoint,过程同上。
        2. 通过MockEndpoint构造ToBuilder。ToBuilder的关键成员变量:
          1. destination:Endpoint:即mock:result
        3. 将ToBuilder加入到FromBuilder的processFactories之中。
    2. 遍历RouteBuilder中的FromBuilder并createRoute(),并增加到RoutBuilder的routes中
      1. 遍历调用FromBuilder的processFactories,创建processor;
        1. 此时processFactories为ToBuilder将创建SendProcessor,其中SendProcessor的destination为mock:result;
        2. 为SendProcessor包装error handler:通过DeadLetterChannelBuilder创建processor为RecipientList(log:org.apache.camel.DeadLetterChannel:error);最终的包装为DeadLetterChannel。
      2. 如果processFactories产生多个processor,则构造CompositeProcessor,此时只有一个SendProcessor;
      3. 通过direct:start以及DeadLetterChannel构造EventDrivenConsumerRoute,返回。
  2. 启动CamelContext
    1. 遍历所有的Component,如果实现了Service方法,则进行启动;此时CamelContext有2个Component:DirectComponet和MockComponet。DirectComponet没有实现Service接口,MockComponet进行了实现,但方法为空。
    2. 遍历所有的route的Servcie并启动,此时为通过direct:start构造的FromBuilder而来的EventDrivenConsumerRoute。
      1. 获取EventDrivenConsumerRoute所包含的Servcie
        1. 获取EventDrivenConsumerRoute对应的processor,如果processor实现了Service接口,则加入列表;此例为DeadLetterChannel,DeadLetterChannel实现了Service接口,需要加入。
        2. 获取EventDrivenConsumerRoute对应的endpoint为direct:start,根据上一步的processor创建Consumer。Consumer接口继承了Service。一定加入。
      2. 启动Service,启动前将这些Service加入到CamelContext需要关闭的服务列表中
        1. 启动DeadLetterChannel
          1. 调用output:Processor的启动方法:调用SendProcessor的启动方法,SendProcessor启动调用destination的成员变量MockEndPoint的createProducer()方法。
          2. 调用deadLetter:Processor的启动方法:RecipientList实现了Service接口,进行启动(实现为空)。
        2. 启动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());
            }
        });

 

  1. 在CamelContext中获取direct:start对应的EndPoint,并设置到CamelTemplate的缓存endpointCache中。
  2. 通过ProducerCache进行send(endpoint,processor)
    1. ProducerCache不包含direct:start的Producer,调用DirectEndipoint进行创建;并进行启动(实现为空)。将Producer设置到ProducerCache中。
    2. 调用Producer的createExchange方法:调用DirectEndpoint的createExchange方法,创建默认的DefaultExchange.
    3. 调用processor的process(defaultExchange)方法。
      1. 调用配置中的方法,即设置名为testCase的header.
    4. 调用Producer的process(defaultExchange)方法。
      1. 调用Producer on DirectEndpoint的process方法
        1. 调用DirectEndpoint的process方法
          1. 依次调用consumer.getProcessor.process(Exchange)方法
            1. DirectEndpoint唯一一个consumer为DeadLetterChannel,调用其process方法
              1. 调用output:SendProcessor的process方法
                1. 调用producer on SendProcessor的process方法
                  1. 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:

  1. addProcessBuilder(new ConstantProcessorBuilder(processor));
  2. 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:

  1. addProcessorBuilder(ProcessorBuilder.setBody(expression));
  2. ToBuilder answer = new ToBuilder(this, endpoint);
    addProcessBuilder(answer);

在makeProcessor时通过上述两个Builder产生的processor构造成new CompositeProcessor

 

在执行阶段,CompositeProcessor遍历执行两个processor。

 

 

-------------------------------------------------------------------------------------------------

Camel 1.1、1.3、1.4对上述过程有较大变动。

分享到:
评论
1 楼 jmszhang 2008-07-03  
对于规则

from("file://target/foo.txt").process(new Processor() {
public void process(Exchange e) {
log.debug("Received exchange: " + e.getIn());
receivedExchange = e;
latch.countDown();
}
});



在启动CamelContext时,将
# 获取EventDrivenConsumerRoute对应的endpoint为file://target/foo.txt,根据上一步的 processor创建FileConsumer。FileConsumer定期扫描该目录,并交给规则后面的process处理。

DirectEndpoint创建的producer的process方法将消费的Exchange传递给consumer按照规则继续向下的prossor处理;
FileEndpoint创建的producer的process方法则将消费的FileExchange进行文件保存或者追加,使用JDK NIO。

相关推荐

    Camel in action(camel实战)

    ### Apache Camel 在行动 #### 一、Apache Camel 概述 Apache Camel 是一个强大的 Java 框架,它使得开发者能够轻松地实现企业级集成模式。通过简洁而强大的领域特定语言(DSL),开发者可以像拼接乐高积木一样将...

    Camel服务集成,服务编排操作文档

    1. **Camel简介** Apache Camel 的设计灵感来源于Enterprise Integration Patterns (EIP),它提供了一个模型来描述如何在不同的系统之间传输数据。Camel的核心组件是路由规则(Routes),这些规则定义了消息如何从...

    Camel_Camel3Camel6函数_

    在MATLAB编程环境中,"Camel3Camel6函数"是指用于特定数学计算或数据分析的一系列函数。这些函数可能涉及到曲线拟合、数值优化、数据处理等应用,尤其是在处理涉及非线性问题时,比如模拟生物体的驼峰形状、物理学中...

    [Camel实战].(Camel.in.Action).Claus.Ibsen&Jonathan;.Anstey.文字版

    ### Apache Camel 实战知识点概述 #### 一、Apache Camel 简介 - **定义**:Apache Camel 是一个强大的开源框架,它使开发者能够轻松地实现企业级集成模式(Enterprise Integration Patterns, EIP)。该框架提供了...

    ApacheCamel-JDBC

    1. **Apache Camel 概述**: Apache Camel 提供了一个丰富的组件库,涵盖了各种协议和数据格式,如HTTP、FTP、JMS、MQTT、XML和JSON等。通过使用简单的DSL(Domain Specific Language)或Java API,开发者可以构建...

    Apache Camel中文开发使用指南.zip

    1. **DSL与路由定义**:Apache Camel支持多种DSL,如Java、XML和Groovy等,用于定义路由规则。例如,你可以使用`from()`方法指定消息来源,`to()`方法定义目标,中间可以用`process()`,`transform()`,`filter()`等...

    camel in action 中文版 第一章

    " Camel In Action 中文版第一章知识点" 本章节将对 Camel 框架进行介绍, Camel 是一个开源的一体化框架,其目的是使一体化系统更容易。本书的第一章节我们将介绍 Camel 及展示它适合大企事业单位的软件。你将会...

    Camel in Action ch1

    ### Camel in Action – Chapter 1: Meet Camel #### 一、引言 《Camel in Action》这本书旨在为读者提供Apache Camel框架的深入理解和实践指南。本书分为三个部分:第一部分介绍初学者需要了解的基本概念;第二...

    Camel实战中文版第四章.pdf

    1. **纯Java调用**: 通过在Camel的`Processor`接口实现类中直接调用bean的方法。 2. **Spring XML配置**: 在Spring XML配置文件中配置bean的调用逻辑。 ##### 4.1 使用bean的复杂方式 **纯Java调用**: 通过自定义`...

    Camel in action PDF和源代码

    《Camel in Action》是关于Apache Camel这一企业级集成框架的专业书籍,这本书深入浅出地讲解了如何使用Camel构建高效、可维护的集成解决方案。PDF版本提供了方便的电子阅读体验,而源代码则帮助读者更好地理解书中...

    Camel_应用开发文档.pdf

    1. Apache Camel 概述 Apache Camel 是一个开源框架,提供了一个统一的方式来集成多种协议、传输和数据格式的应用程序。它支持多种协议,例如 HTTP、FTP、JMS、MQTT 等,能够帮助开发者快速构建企业应用集成系统。 ...

    apache camel 集成组件 教程

    1. **灵活的消息路由:** Camel 提供了一种基于领域特定语言(DSL)的路由机制,允许开发者以声明式的方式定义消息的流向。 2. **丰富的集成组件:** Camel 内置了大量的组件,支持各种协议和服务,如 HTTP、JMS、...

    ApacheCamel-Timer

    Apache Camel 是一个强大的开源集成框架,它允许开发者通过声明式的方式定义路由和转换数据流,使得构建企业级应用变得更加简单。Timer 组件是 Apache Camel 中的一个重要部分,它提供了定时触发事件的功能,类似于 ...

    Apache Camel 源码分析.rar

    Apache Camel 是一个强大的开源企业集成库,它提供了一种声明式的方式来定义路由和转换数据,使得构建复杂的分布式系统变得更加简单。Camel 使用一种名为“DSL”(Domain Specific Language)的语法规则,允许开发者...

    CAMEL 呼叫流程和信令流程

    ### CAMEL呼叫流程与信令流程详解 #### 概述 CAMEL(Customised Applications for Mobile network Enhanced Logic)是一种用于移动网络的智能网技术,它为移动运营商提供了定制化的增值服务功能。CAMEL主要应用于...

    Apache Camel 开发指南.rar

    1. **错误处理**:Camel 提供了多种错误处理策略,如继续处理、重试、跳过或者停止。通过`onException`和`handled`等关键字,可以定制错误处理逻辑。 2. **并发处理**:Camel 支持多线程和并发,可以使用`...

    camel文档

    #### 第一部分:初次接触Camel(第1章至第2章) - **第1章:遇见Camel** - **简介**:介绍Apache Camel的基础概念及其在企业级应用中的价值。 - **核心特性**:阐述Camel的主要功能和优势,包括其支持的各种协议...

    apache-camel-3.7.0_数据同步_

    1. **组件**:Apache Camel 包含了大量的预构建组件,如JDBC(Java Database Connectivity)用于与数据库交互,FTP/FTPS/SFTP用于文件传输,MQTT和AMQP用于消息队列,以及HTTP/HTTPS用于Web服务等。这些组件使得数据...

    camel-manual-2.10.4.pdf

    Apache Camel是一个基于已知企业集成模式的多功能开源集成框架。它提供了一种灵活的方式来定义路由和调解规则,支持多种特定领域的语言,包括基于Java的Fluent API、Spring或Blueprint XML配置文件以及Scala DSL。这...

Global site tag (gtag.js) - Google Analytics