Apache Camel 簡介
Camel簡介
Camel是一個基于規則路由和中介引擎,提供企業集成模式的Java對象的實現,通過應用程序接口(或稱為陳述式的Java領域特定語言(DSL))來配置路由和中介的規則。領域特定語言意味著Apache Camel支持你在的集成開發工具中使用平常的,類型安全的,可自動補全的Java代碼來編寫路由規則,與那種復雜的XML配置相比極大簡化了規則定義開發。同時,它也支持在Spring中使用XML配置定義路由和中介規則。
Camel 采用URI來描述各種組件,這樣你可以很方便地與各種傳輸或者消息模塊進行交互,其中包含的模塊有 HTTP, ActiveMQ, JMS, JBI, SCA, MINA,CXF 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)將某文件,讀入并寫入到ActiveMQ的JMS中。
Camel中的Endpoint類似webservice中的endpoint,即某個資源的位置。Camel使用URI來定位一個enpoint. 比如上例中的from(“file://xxxx”), 可以是file:///edi/po/?include=.*\\.txt, 代表/EDI/PO/下的所有txt文件,即為一個endpoint。
Camel的內置組件(用戶也可以按照Camel的接口約定,來定義自己的component),用以提供對某種協議的資源訪問的支持,如上例中的file即為component, 其提供了對本地文件系統訪問的支持,activemq是另一個component, 提供了camel訪問以ActiveMQ實現的JMS的直接訪問能力。
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組件,路由至一個名為tempQ的JMS隊列。
該語法是java兼容的,可以正常在Eclipse等Java IDE中編輯并編譯。
B. Spring語法兼容的XML配置文件
<route>
<from uri="file://inputdir/"/>
<convertBodyTotype="java.lang.String"/>
<to uri="activemq:queue:tempQ "/>
</route>
此例子中,讀取inputdir文件夾下的文件,然后轉換成String,寫入名為tempQ的JMS隊列。
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特定于域的語言除了Spring的XML配置路由規則,并提供企業集成模式;
Camel的API極小而干凈的,與的JBI,CXF的和的JMS的API緊密匹配。基于周圍消息交換的Camel要比基于UMO模型的Mule能更加緊密地映射到REST,WS,的WSDL和JBI;
Camel允許容易地暴露底層的傳輸細節(例如JmsExchange,JbiExchange,HttpExchange);
Camel在核心API支持隱式類型轉換器,能更容易地把組件連接在一起;
Camel和Apache ActiveMQ,CXF,ServiceMix有很好的集成,而這些項目都是 企業應用開發經常會接觸到的。
另外,Camel是完全開源,而Mule和Fuse套件的商業許可帶有限制性。