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
网友评论