- JBoss Fuse 教程
- JBoss Fuse – 首頁
- JBoss Fuse - ESB 簡介
- 什麼是 Fuse?
- JBoss Fuse – Apache Karaf
- JBoss Fuse – Apache Camel
- JBoss Fuse – Camel 概念
- JBoss Fuse – Apache CXF
- JBoss Fuse – REST Web 服務
- JBoss Fuse – Apache AMQ
- JBoss Fuse – Camel 與 AMQ
- JBoss Fuse – Fabric
- JBoss Fuse – 子容器
- JBoss Fuse – 問題和解決方案
- JBoss Fuse 有用資源
- JBoss Fuse - 快速指南
- JBoss Fuse - 有用資源
- JBoss Fuse - 討論
JBoss Fuse - Camel 概念
本章我們將瞭解不同的 Camel 概念。讓我們從一個基本的例子開始,瞭解核心概念。
CamelContext
每個 Camel 應用至少包含一個 CamelContext。這是我們新增 Camel 路由的地方。它類似於 Spring 的ApplicationContext。
Camel context 可以被認為是一個容器,它將所有內容整合在一起。一個 Camel context 可以包含多個路由。
路由
CamelContext 可能包含一個或多個路由。路由是整合邏輯,它定義資料如何在 Camel context 中從一個端點流向另一個端點。
端點
端點是通道的終點,系統可以透過它傳送或接收訊息。在通訊語言中,我們稱之為目的地或源。
元件
元件是 Camel 的擴充套件點。元件可以是技術的介面、資料格式、轉換器等等。它們也可以充當端點的工廠。
EIP
EIP 代表企業整合模式 (Enterprise Integration Pattern)。這些模式是針對重複出現問題的已識別和眾所周知的解決方案。Camel 支援大多數企業整合模式。
基於內容的路由器
CBR 模式允許我們根據輸入檔案的內容來路由資料。
當我們需要根據輸入正文的內容來路由值時,可以使用此模式。
下面的例子將從D:/data/input目錄讀取資料。讀取後,它將檢查data標籤內的value標籤的值。如果value標籤包含value1,則將其傳送到D:/value1;如果包含value2,則將其傳送到D:/value2;如果都不包含,則將其傳送到others。
<CamelContext xmlns = "http://camel.apache.org/schema/spring">
<route>
<from uri = "file:///D:/data/input"/>
<choice>
<when>
<xpath>/data/value = 'value1'</xpath>
<to uri = "file:///D:/value1"/>
</when>
<when>
<xpath>/data/value = 'value2'</xpath>
<to uri = "file:///D:/value2"/>
</when>
<otherwise>
<to uri = "file:///D:/others "/>
</otherwise>
</choice>
</route>
</camelContext>
輸入
D:/data/input/message1.xml
<data> <value>value1</value> </data>
D:/data/input/message2.xml
<data> <value>value2</value> </data>
輸出
D:/value1/
<data> <value>value1</value> </data>
D:/value2/
<data> <value>value2</value> </data>
拆分器
拆分器模式用於將輸入資料拆分為更小的塊。
此模式通常用於處理需要拆分成塊的大型輸入資料,以便使其可處理。它根據輸入標記字串將輸入分解成更小的片段。
<CamelContext xmlns = "http://camel.apache.org/schema/spring">
<route>
<from uri = "file:///D:/inbox"/>
<split streaming = "true">
<tokenize token = "order" xml = "true"/>
<to uri = "activemq:queue:order"/>
</split>
</route>
</CamelContext>
輸入
D:/inbox/message.xml
<order>
<data>
<value>value1</value>
</data>
</order>
<order>
<data>
<value>value2</value>
</data>
</order>
<order>
<data>
<value>value3</value>
</data>
</order>
輸出
如果檢查 AMQ,你會發現釋出了 3 條訊息。
<order>
<data>
<value>value4</value>
</data>
</order>
接收者列表
當需要從訊息正文字身檢索接收者列表時,使用接收者列表模式。
在下面的例子中,訊息將傳送給在 customer 標籤中以逗號分隔的字串列表列出的所有接收者。
<CamelContext xmlns = "http://camel.apache.org/schema/spring">
<route>
<from uri = "jms:xmlOrders" />
<recipientList>
<xpath>/order/customer</xpath>
</recipientList>
</route>
</camelContext>
其他 EIP
Camel 支援幾乎所有已識別的 EIP。一些常用的 EIP 如下所述。
日誌 - 記錄完整訊息或部分訊息
訊息過濾器 - 過濾訊息內容
重新排序器 - 按順序獲取所有標記
竊聽器 - 檢查正在傳輸的訊息
Camel EIP 的完整列表及其用法可以在 Camel 的官方文件中找到 http://camel.apache.org/eip.html
Camel 中的異常處理
使用錯誤處理器 - 這是處理 Camel 中異常最簡單的方法。
要使用此方法,我們必須配置 Error handler 類 bean 並將其作為引用提供給CamelContext errorHandlerRef 屬性。
<bean id = "loggingErrorHandler" class = "org.apache.camel.builder.LoggingErrorHandler"> <property name = "logName" value = "mylogger.name"/> <property name = "level" value = "DEBUG"/> </bean> <camelContext errorHandlerRef = ” loggingErrorHandler” > … </camelContext>
使用 Try Catch Finally
Camel 還支援 Java 風格的Try Catch Finally 塊用於異常處理。
與 Java 一樣,它包含以下三個塊:
doTry 塊包含可能生成異常的程式碼。
doCatch 塊包含在發生異常時需要執行的程式碼。
doFinally 塊包含必須執行的程式碼,無論是否發生異常。無論是否引發異常,它都將始終執行。
注意 - Mock 是測試元件,不建議用於其他目的。它是 Camel 中用於測試的元件,就像 Test driven development 中的 jMock 元件一樣。
<route>
<from uri = "direct:start"/>
<doTry>
<process ref = "someProcesorThatmayFail"/>
<to uri = "mock:result"/>
<doCatch>
<exception>java.io.IOException</exception>
<exception>java.lang.IllegalStateException</exception>
<to uri = "mock:catch"/>
</doCatch>
<doFinally>
<to uri = "mock:finally"/>
</doFinally>
</doTry>
</route>
在上面的例子中,我們可以列出需要由 catch 塊處理的異常。
在 Fuse 中部署 Bundle
使用Fuse.bat/start.bat啟動 Fuse。
如果使用 start.bat 啟動 Fuse,請使用 client.bat 連線到 Fuse。你應該會看到如下所示的 UI 截圖。
這是訪問 Karaf 和 Fuse 命令的 CLI。
install –s mvn:group.id /artifact.id/version e.g. install –s mvn:com.tutorialpoint.app/camel-firt-app/1.0-SNAPSHOT