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 面向领域的语言)来定义;<Java DSL不是DSL>
                    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<String,Object>,在下一个节点可以再取出来
                        Attachments:在调用Web Service或是发邮件的时候放附件
                        Body:消息内容,Java对象
                    Out message:当MEP是InOut的时候才用,是非mandatory的
                        Header:键值对 Map<String,Object> 在下一个节点可以再取出来
                        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的集成:

Apache Camel学习笔记相关推荐

  1. Apache POI学习笔记

    概述 Apache POI 简介是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel.WORD.Power ...

  2. Apache Drill学习笔记一:环境搭建和简单试用

    简介 Apache Drill是一个低延迟的分布式海量数据(涵盖结构化.半结构化以及嵌套数据)交互式查询引擎,使用ANSI SQL兼容语法,支持本地文件.HDFS.HBase.MongoDB等后端存储 ...

  3. Apache Log4j 学习笔记

    Apache Logging Project Homepage: http://logging.apache.org Log4j的类图 Logger - 日志写出器,供程序员输出日志信息 Append ...

  4. Apache服务器学习笔记

    Apache服务器知识 首先我们要知道一共有那几个程序在监听网络端口,即与网络保持活跃连接,打开CMD命令窗口 输入: netstat  –an 指令就能显示出所有与网络保持连接的程序,输入net s ...

  5. 文件用户Apache shiro学习笔记+ spring整合shiro (一)

    改章节朋友在青岛游玩的时候突然想到的...这两天就有想写几篇关于文件用户的博客,所以回家到之后就奋笔疾书的写出来发表了 Apache Shiro官网:http://shiro.apache.org/ ...

  6. Apache kylin学习笔记

    一.Apache kylin的核心概念 表(Table ):表定义在hive中,是数据立方体(Data cube)的数据源,在build cube 之前,必须同步在 kylin中. 模型(model) ...

  7. Apache MiNa 2 学习笔记

    http://blog.csdn.net/cgwcgw_/article/details/18402769 http://download.csdn.net/detail/xiaozhu_1986/2 ...

  8. 09Apache POI学习笔记

    Apache POI学习笔记 文章目录 1 Poi介绍 1.1 poi简介 1.2 依赖包 1.3 POI包结构 1.4 优劣势 2 入门案例 2.1 从Excel文件读取数据 2.1.1 读取步骤 ...

  9. Apache-mina学习笔记,非常全都资料,附带大量实例

    Apache Mina2 学习笔记 目录 引言. 3 一.    Mina入门. 3 第一步.下载使用的Jar包. 3 第二步.工程创建配置. 4 第三步.服务端程序. 4 第四步.使用telnet命 ...

最新文章

  1. Android快速阅读依赖的代码,Java Android快速阅读完整文件
  2. 内核层CS段描述符信息
  3. 几个 ASP.NET 小技巧
  4. POJ 1654 Area 凸包面积
  5. html常用标签6-表单标签
  6. mysql linux32_linux 32 位mysql 安装中的问题 以及修改数据库密码
  7. 【优化算法】变异策略的改进型花朵授粉算法【含Matlab源码 480期】
  8. 如何从一个USB上安装Windows Vista
  9. mysql 拼音模糊查询_mysql中文字段转拼音首字母,以及中文拼音模糊查询
  10. 安装包制作工具 SetupFactory使用 详解
  11. cs1.6修改服务器参数设置,cs1.6比赛服务器设置参数
  12. [VS code - SSH Remote] ln: failed to create hard link ... File exists
  13. elasticsearch实战 中文+拼音搜索
  14. app指纹登录 java后端_Android应用实现指纹登录
  15. python timer详解_Python timer定时器两种常用方法解析
  16. Object.prototype.__proto__ 、Object.prototype和 Object.prototype.constructor
  17. python中的subprocess.Popen()使用
  18. 1725 天黑请闭眼
  19. 微信群机器人微云助手微小云微信群淘客助手如何设置好券直播淘宝联盟优惠券自动群发
  20. 【渗透工具】浏览器数据导出工具

热门文章

  1. 内存管理pbuf.h头文件源码解析——LwIP学习
  2. 2022最新软件测试面试题(含答案)
  3. 证券数据接口 查询证券编码及基本上市信息
  4. python excel画图_python读取excel数据并且画图
  5. 关于递归算法设计的思考
  6. thinkphp核心 伯乐发卡系统高级版PHP网站源码 已去授权无后门_已测
  7. STM32F103ZET6超声波测距(hcsr04模块)实验
  8. Excel 数字转日期类型
  9. MySql的存储过程的优点与缺点
  10. 3月下旬到5月中旬之前采制的茶叶