Apache Camel学习笔记

    Apache Camel:
        概念:是一个基于 规则路由 和 processor处理 的引擎。
            官网介绍:Camel允许您创建企业集成模式,以基于Java的域特定语言(或Fluent API),基于Spring或Blueprint的Xml配置文件或通过Scala DSL实现路由和中介规则。
                这意味着无论是在Java,Scala还是XML编辑器中,您都可以在IDE中智能地完成路由规则。
            企业集成模式:Enterprise Integration Patterns()
        主要功能:协议转换,消息路由
        核心思想:从一个from源头得到数据,通过processor处理,再发到一个to目的的.
            这个from和to可以是我们在项目集成中经常碰到的类型:一个FTP文件夹中的文件,一个MQ的queue,一个HTTP request/response,一个webservice等等.
        要素:
            Camel Context:Camel的运行容器,管理所有的camel路由,类似Spring的context.
                CamelContext是对Camel运行时的一个抽象,一般来说一个Camel应用里会有一个CamelContext对象;
            Route:路由;定义了Message在一个系统中传输的真实路径/通道。开发者可以自己定义路由,并且需要信任引擎可以完成复杂的传输工作。每个路由都有唯一的标识符,用来记录日志,调试,监控,以及启动或停止路由。
                ASB中路由在csb-routes中的restproxy中,其中的CallRecordPolicy中的onstart(),onStop()等方法定义了路由调用前后的操作等,ValidityCheck(implements Processor)定义了访问路由时的参数检查,。。。。。。
                
                个人理解路由就是对于一个Message的处理流程的定义,定义路由规则即为定义一个流程,让其按照我们定义的规则走下去
            
                一个route就是将从输入队列中得到的消息,通过一步步设置好的逻辑判断(例如过滤器和路由规则),到达一个目标队列中(如果有的话);Camel为应用开发者提供了两种方式来定义这些路由规则:
                    一种是通过XML来定义;另一种就是通过Java DSL(donain specific language 面向领域的语言)来定义;
                    Example for Camel's Java DSL:
                    RouteBuilder builder = new RouteBuilder(){
                    public void configure(){
                        form("queue:a").filter(header("foo").isEquals("bar")).to("queue:b");
                        from("queue:c").choice()
                            .when(header("foo").isEquals("bar")).to("queue:d")
                            .when(header("foo").isEquals("mail")).to("queue:e")
                            .otherwise().to("queue:f")
                    }
                    };
                    CamelContext myCamelContext = new DefaultCamelContext();
                    myCamelContext.addRoutes(builder);
            

            Processor:是一个消息接收者和消息通信的处理器(一个处理消息的类)。Processor是Route的一个元素,可用来消息格式转换或者其他的一些变化;
                 Processor接口的定义如下:
                Processor
                package org.apache.camel;
                public interface Processor{
                    void process(Exchange exchange)throws Exception;                }
                Processor
                注意Process()方法中的参数是一个Exchange而不是一个Message。 这样的定义提供了更大的灵活性。例如我们可以在Process方法中调用exchange.getIn()来获取输入的消息,并处理它。 如果在处理过程中
                发生了错误,我们可以通过调用 exchange.setException() 设置这个异常。

            Endpoint: Endpoint作为Camel系统中一个通道的端点,可以发送或者接收消息。在Camel中Endpoint通过URI来配置,在运行时Camel来查找端点,端点的功能强大全面且可维护。
            Component:或者说EndpointFactory更合适,Component是创建Endpoint实例的工厂类; 
                例如:假如一个Camel应用使用了几个JMS队列,那么这个Camel应用首先应该创建一个叫JSMComponent(实现了Component接口)的对象,然后应用会调用这个JSMComponent对象的createEndpoint()方法来创建一个
                JSMEndpoint对象(实现了Endpoint接口)。 事实上,应用代码并没有直接调用Component.createEndopint()方法,而是Camel-Context容器通过找到对应的Component对象,并调用createEndpoint()方法来实现的;
                
                CamelContext对象定义一个URI参数:myCamelContext.getEndpoint("dubbo://john.dubbotest.com?id=0001");
                在getEndpoint()中使用的参数就是URI,这个URI的前缀(:之前的部分)描述了一个组件的名字,CamelContext中维护这一个组件名字与Component对象的映射表;对于以上给定的URI的例子来说,CamelContext对象
                会根据pop3前缀找到对应的MailComponent类,然后CamelContext对象会调用MailComponent的createEndpoint("dubbo://john.dubbotest.com?id=0001")方法;在createEndpoint()方法中, 将把URI
                分割成一段段小的参数,这些小参数将被用来设置生成的Endpoint对象。
                CamelContext对象维护的一个组件名到Component对象的映射表,这个映射表是如何产生的呢?
                方法一:
                    通过代码调用CamelContext.addComponent(String componentName,Component component)来实现;
                    例:(如下是给一个MailComponent对象注册三个不同的名字)
                    Component mailComponent = new MailComponent();
                    mailCamelContext.addComponent("dubbo",mailComponent);
                    mailCamelContext.addComponent("dubbo2",mailComponent);
                    mailCamelContext.addComponent("dubbo3",mailComponent);

                方法二(常用):(通过CamelContext对象来实现一个懒初始化)
                    此方法依赖于一套Camel内部定义的Component发现规则,开发者只要在实现Component时按照这一规则来设置,就可以保证CamelContextn能够正常发现这一Component;
                     这里我们假设你所写的Class名字为 org.apache.camel.component.dubboExample.DubboComponent, 并且你想让Camel自动将这个component和"dubbo”这个名字相对应。
                     那么需要先写一个叫做"META-INF/services/org/apache/camel/component/dubbo" 属性文件(也可以是foo文件对应FooComponent),文件内容如下:
                        class=org.apache.camel.component.dubboExample.DubboComponent
                    注意(1) 这个文件没有" .proeprties"作为后缀名,且这个文件中的内容只有一个class条目。
                        (2) 如果还想将DubboComponent和foo这个名字联系起来,那么还可以在相同的目录(META-INF/services/org/apache/camel/component)下创建一个内容相同的名字为foo的文件

                    完成这些配置后,可以将DubboComponent 的class文件和这些配置文件打成jar包并放在ClassPath中,这样Camel就会通过分析这些属性文件的class项目,通过使用reflectionAPI创建
                    这个指定的类的实例。
                
                   Camel对多种通信协议提供了开箱即用的支持,这种支持正是建立在实现了Component的类及 让CamelContext自动建立映射的配置文件的基础之上的。

            Message:  Message 接口提供了一个对单个消息的抽象,这些消息可以是一个请求,回复或者是一个异常。
                
                对于每个Camel是支持的通讯技术来说,都需要提供一个Message接口的实现。例如JmsMessage就提供了一个Message接口的JMS实现. 在message接口中提供一个get/set方法来访问message id, 
                body 以及message中每个单独header。

            Exchange: 一个消息之间通信的抽象的会话;
                在Camel的Route中,消息在各Route中是以Exchange形式传递的。Exchange的结构
                Exchange
                    Exchange ID: 用来标识一个route的一次执行,如果不指定,camel会随机设定一个;
                    MEP:message exchage pattern 有InOnly和InOut两种方式
                    Exception: 在route抛出异常的时候,抛出的异常值赋给这个变量;
                    Properties:
                    In message: 上一个节点传入的内容,是mandatory的(强制)    
                        Header:键值对 Map,在下一个节点可以再取出来
                        Attachments:在调用Web Service或是发邮件的时候放附件
                        Body:消息内容,Java对象
                    Out message:当MEP是InOut的时候才用,是非mandatory的
                        Header:键值对 Map 在下一个节点可以再取出来
                        Attachment:在调用webservice或者发邮件的时候放附件
                        Body:消息内容,Java对象
                    Exchange可以直接作为参数在route用到的方法中使用,如果route中的方法不是Exchange,Camel会根据一套规则将Exchange中的Body转换成该方法的参数类型.
                    这个结构里的各部分内容可以像下面的代码示例的方式进行访问:
                    https://blog.csdn.net/kkdelta/article/details/7432867
                        
                
        各要素之间的流程:
            一个典型的Camel应用按照下面几个步骤进行:
                1.创建一个CamelContext对象
                2.向CamelContext对象中添加Endpoints和Components
                3.向CamelContext对象中添加route规则
                4.调用CamelContext对象的start()方法,这样可以启动camel内部有关消息发送,接收,处理所使用的线程
                5.当调用CamelContext对象的stop()方法时,Camel会将妥善关闭所有endpoints 和Camel内部的线程
        ASB项目中的配置:
        如何与系统其它模块关联(上行下行):
        Spring与Apache Camel的集成:

你可能感兴趣的:(路由)