在先前的博文中,我們了解了企業集成模式(EIP)。 現在,在這篇文章中,我們將研究實現這些模式的Apache Camel框架。
關于駱駝:
Apache Camel是一個開放源代碼項目,已有將近5年的歷史,并且擁有大量的用戶社區。 該框架的核心是一個引擎,它負責中介工作并將消息從一個系統路由到另一個系統。 在外圍,它具有大量的組件,可以與使用各種協議(例如FTP,RPC,Webservices,HTTP,JMS,REST等)的系統進行接口。 它還提供了Java,Spring和Scala中易于理解的領域特定語言。
現在讓我們開始使用Apache駱駝。 我們將使用maven設置一個項目,為所需的駱駝庫添加依賴項,并使用Java和Spring DSL編寫示例。
考慮一個接受兩種類型訂單的系統。 小部件和小工具。 訂單到達JMS隊列并以XML格式指定。 小工具清單會輪詢文件目錄中的傳入訂單,而小部件清單會在隊列上偵聽。 我們對所有到達的訂單運行XPath,并確定它們是屬于小部件還是小工具庫存。 下圖描述了我們的用例:
首先,只需在目錄中打開命令行窗口,然后鍵入mvn archetype:generate
"c:\myprojects>mvn archetype:generate
假設我們的路徑中有maven 2+和jdk 1.6版本,同樣要運行此示例,我們需要一個activemq代理。
我們將在pom中添加以下依賴項
org.apache.camel : camel-core : 2.10.1
- Lib containing Camel engineorg.apache.camel : camel-ftp : 2.10.1
- Camel's ftp componentorg.apache.activemq : activemq-camel : 5.6.0
org.apache.activemq : activemq-pool : 5.6.0
- Libs required to integrate camel with activemqlog4j : log4j : 1.2.16
org.slf4j : slf4j-log4j12 : 1.6.4
- Libs for logging
完整的pom.xml粘貼在該要點條目上。
現在,讓我們的駱駝路線編碼,該路線將輪詢JMS隊列,應用XPath找出該訂單是用于小工具清單還是窗口小部件清單,然后將其路由到FTP目錄或JMS隊列。
到達我們系統的訂單具有以下結構
<xml version="1.0" encoding="UTF-8"> <order><product>gadget</product><lineitems><item>cdplayer</item><qty>2</qty></lineitems><lineitems><item>ipod-nano</item><qty>1</qty></lineitems>
</order>
product元素的值指定是gadget還是小部件訂單。 因此,在訂單的XPath下方應用將使我們決定將該消息路由到的位置。/order/product=“ gadget”,然后轉發至FTP目錄,否則轉發至隊列。
現在讓我們對路由進行編碼,為此,需要擴展RouteBuilder(org.apache.camel.builder.RouteBuilder)類并覆蓋它的configure方法。 我們將類命名為JavaDSLMain,并將以下代碼放入其configure方法中:
from("activemq:queue:NewOrders?brokerURL=tcp://192.168.64.144:61616").choice().when(xpath("/order/product = 'gadget'")).to("activemq:queue:GadgetOrders?brokerURL=tcp://192.168.64.144:61616").otherwise().to("ftp://192.168.101.3/camel-demo?username=admin&password=admin&binary=true");
這樣做之后,現在讓我們分析以上路線。 上面的關鍵字構成了駱駝EIP DSL; 該路線的目的總結如下:
from :這表示從端點獲取消息,即consume ,在我們的情況下,這恰好是一個隊列。
選擇 :這是一個謂詞,在這里我們應用一個簡單的規則。
xpath :這表示將xpath應用于當前消息,xpath的結果為布爾值。 到 :這告訴駱駝將消息放在端點上,即產生 。
每個關鍵字都可以使用一些參數來工作。 例如,from采取端點參數來消費消息,在本例中,它是JMS(activemq)代理上的隊列。
注意,Camel會自動為您進行類型轉換,在上述路由中,在應用XPath之前,消息對象已轉換為DOM。
我們還將main方法放入此類本身,以快速對其進行測試。 在main方法內部,我們需要實例化一個Camel上下文,該上下文將承載此路由,并且在啟動上下文時,Camel將設置路由并開始偵聽NewOrders隊列。
main方法中包含的代碼如下:
CamelContext camelContext = new DefaultCamelContext();
camelContext.addRoutes(new JavaDSLMain());
camelContext.start();
/* wait indefinitely */
Object obj = new Object();
synchronized (obj) {
obj.wait();
}
查看此要點條目以獲取完整的代碼清單。
使用Camel的另一種方法是使用Spring,Camel路由進入Spring應用程序上下文文件。 我們只使用XML來快速定義路由,而不是編寫Java代碼。 為此,我們需要在Spring上下文文件中導入Camel名稱空間并使用
諸如Spring工具套件之類的IDE可以快速構建和編寫集成應用程序。
在這個gist條目中檢查展示Camel路由的Spring應用程序上下文。將該上下文文件放在META-INF / spring文件夾中,即在我們的maven項目中,它位于/ src / main / resources / META-INF / spring文件夾下。
在頂部,我們導入了Camel的Spring命名空間,該命名空間允許在Spring的應用程序上下文中定義Camel路由,此外,在我們的pom文件中,我們需要添加依賴項以包含Spring bean的依賴關系,以在Spring中識別和實例化Camel引擎。 在下面添加以包括對Spring的Camel支持。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring</artifactId>
<version>2.10.1</version></dependency>
Camel提供了一個幫助程序類(org.apache.camel.spring.Main),它可以掃描保存在下面的所有Spring應用程序上下文文件。
META-INF / spring文件夾保存在類路徑下。 檢查顯示所需代碼的要點條目。 通過這個示例,我們實現了基于內容的路由器模式,該模式檢查消息的內容以進行路由決策。
參考:來自NS.Infra博客的JCG合作伙伴 Abhishek Jain的Apache Camel入門 。
翻譯自: https://www.javacodegeeks.com/2012/12/getting-started-with-apache-camel.html