Camel Note1

版本: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对上述过程有较大变动。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值