美文网首页
Apache Camel

Apache Camel

作者: 林太浪先生 | 来源:发表于2019-10-30 14:18 被阅读0次

https://blog.csdn.net/swollow_/article/details/80896038  

 核心思想:

            从一个from源头得到数据,通过processor处理,再发到一个to目的的.

            这个from和to可以是我们在项目集成中经常碰到的类型:一个FTP文件夹中的文件,一个MQ的queue,一个HTTP request/response,一个webservice等等.

 要素:

            CamelContext

            Camel的运行容器,管理所有的camel路由,类似Spring的context.

            CamelContext是对Camel运行时的一个抽象,一般来说一个Camel应用里会有一个CamelContext对象;

            Route:

                 路由;定义了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()方法来实现的;

                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转换成该方法的参数类型.

各要素之间的流程:

            一个典型的Camel应用按照下面几个步骤进行:

                1.创建一个CamelContext对象

                2.向CamelContext对象中添加Endpoints和Components

                3.向CamelContext对象中添加route规则

                4.调用CamelContext对象的start()方法,这样可以启动camel内部有关消息发送,接收,处理所使用的线程

                5.当调用CamelContext对象的stop()方法时,Camel会将妥善关闭所有endpoints 和Camel内部的线程

————————————————

版权声明:本文为CSDN博主「Mr_YDK」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/ydk888888/article/details/81980279

相关文章

网友评论

      本文标题:Apache Camel

      本文链接:https://www.haomeiwen.com/subject/eisgvctx.html