Apache Camel 简介

jopen 12年前

Camel简介

Camel是一个基于规则路由和中介引擎,提供企业集成模式的Java对象的实现,通过应用程序接口(或称为陈述式的Java领域特定语言(DSL))来配置路由和中介的规则。领域特定语言意味着Apache Camel支持你在的集成开发工具中使用平常的,类型安全的,可自动补全的Java代码来编写路由规则,与那种复杂的XML配置相比极大简化了规则定义开发。同时,它也支持在Spring中使用XML配置定义路由和中介规则。

Camel 采用URI来描述各种组件,这样你可以很方便地与各种传输或者消息模块进行交互,其中包含的模块有 HTTP, ActiveMQ, JMS, JBI, SCA, MINACXF Bus API 这些模块是采用可插拔的方式进行工作的。Apache Camel的核心十分小巧你可以很容易地将其集成在各种Java应用中。目前Apache Camel作为一个路由以及媒介引擎可以与Apache ActiveMQ Apache CXF Apache MINA Apache ServiceMix项目集成。

     Camel提供的基于规则的路由(Routing)引擎,可以使用Camel定义的DSL语言,方便的定义出各种Routing

     如下例:

     from(“file://xxxx").to("activemq://xxxx)将某文件,读入并写入到ActiveMQJMS中。

 

基本概念

1. Endpoint

     Camel中的Endpoint类似webservice中的endpoint,即某个资源的位置。Camel使用URI来定位一个enpoint. 比如上例中的from(“file://xxxx”), 可以是file:///edi/po/?include=.*\\.txt, 代表/EDI/PO/下的所有txt文件,即为一个endpoint

2. Component

     Camel的内置组件(用户也可以按照Camel的接口约定,来定义自己的component),用以提供对某种协议的资源访问的支持,如上例中的file即为component, 其提供了对本地文件系统访问的支持,activemq是另一个component, 提供了camel访问以ActiveMQ实现的JMS的直接访问能力。

3. Routing Language

Camel 提供了3种方式定义Routing,

 

A. Java 语言兼容的DSL语言

举例:

from("file:edifiles?include=.*\\.txt").to("smooks://classpath:smooks-config.xml") .

bean(wrapper, "wrap") .to("activemq:queue:tempQ")

end();

此例子中,是读取edifiles文件夹下的所有txt文件,然后路由至smooks组件,smooks是一个文件转换组件,完成后,调用bean组件,bean是一个可以调用用户自己定义的POJO的组件,完成后,通过activemq组件,路由至一个名为tempQJMS队列。

该语法是java兼容的,可以正常在EclipseJava IDE中编辑并编译。

 

B. Spring语法兼容的XML配置文件

<route>

<from uri="file://inputdir/"/>

<convertBodyTotype="java.lang.String"/>

<to uri="activemq:queue:tempQ "/>

</route>

此例子中,读取inputdir文件夹下的文件,然后转换成String,写入名为tempQJMS队列。

 

C. ScalaDSL

 

Camel的特点和优势:

1.    应用范围和特点

对于企业应用来说,由于历史或者多厂商等原因造成了其系统之间的通讯协议多样化,而由于企业业务发展,这些应用系统之间交互需求日益增多。Apache Camel可以帮助大家通过定义简单的路由规则来实现不同企业应用之间的互联互通。Apache Camel 把不同的企业应用抽象成为Endpoint 通过URI来对这些Endpoint 进行描述,由于Apache Camel提供了一个基于POJO的企业应用模式的实现,同时Camel提供了60多个组件来负责具体的传输协 议,这样用户可以通过简单的消息路由规则定义,就可以实现各应用系统之间交互。


   
举个例子,如果你有一个应用只提供一个JMS接口,而你的另一个应用提供 WebServices接口,那你的路由规则可以这么定义:
from("jms://xxxx").to("cxf://xxxx)

  
当然你有可能需要对JMS接口过来的消息做一些处理在转发给WebService应用。那只需在两个节点之间要加入一个processor来实现你需要做的处理就行了
from("jms://xxxx").processor(new MyProcessor()).to("cxf://xxxx")

   
由上面的例子可以看到Camel的路由规则很直观简单,可以像写Java代码一样定义路由规则。
    
当然Camel还提供了其他方式来描述路由规则,例如Spring 配置文件,Scala等。

 

2. 优势

 

目前市面上有不少的同类产品,例如同是开源的Mule,以及商业产品Fuse套件。

 

Camel与它们相比有最大的不同就是它十分小巧,而且不容易让开发人员失去对代码的控制。使用者可以把它当作一个小的应用库,而不是一个大的运行容器。这样可以很轻松地将其集成的Web容器,JBI容器,或者OSGi容器中。

 

也可以像写Java代码的方式编辑路由规则,支持开发人员在的集成开发工具中使用平常的,类型安全的,可自动补全的Java代码来编写路由规则,与那种复杂的XML配置相比极大简化了规则定义开发。

 

更详细的有以下几点:

Camel使用一个Java特定于域的语言除了SpringXML配置路由规则,并提供企业集成模式;

CamelAPI极小而干净的,与的JBICXF的和的JMSAPI紧密匹配。基于周围消息交换的Camel要比基于UMO模型的Mule能更加紧密地映射到RESTWS,的WSDLJBI

Camel允许容易地暴露底层的传输细节(例如JmsExchangeJbiExchangeHttpExchange);

Camel在核心API支持隐式类型转换器,能更容易地把组件连接在一起;

 

CamelApache ActiveMQCXFServiceMix有很好的集成,而这些项目都是 企业应用开发经常会接触到的。

 

另外,Camel是完全开源,而MuleFuse套件的商业许可带有限制性。

项目主页:http://www.open-open.com/lib/view/home/1340807942296

</span>