- Apache Camel 教程
- Apache Camel - 首頁
- Apache Camel - 簡介
- Apache Camel - 概述
- Apache Camel - 功能特性
- Apache Camel - 架構
- Apache Camel - CamelContext
- Apache Camel - 端點
- Apache Camel - 元件
- Apache Camel - 訊息佇列
- Apache Camel - 專案
- 使用 Spring 與 Camel
- Apache Camel 有用資源
- Apache Camel - 快速指南
- Apache Camel - 有用資源
- Apache Camel - 討論
Apache Camel - CamelContext
CamelContext 提供了對 Camel 中所有其他服務的訪問,如下圖所示:
讓我們看看各種服務。登錄檔模組預設情況下是 JNDI 登錄檔,它儲存應用程式使用的各種 JavaBean 的名稱。如果使用 Spring 與 Camel,則它將是 Spring ApplicationContext。如果在 OSGI 容器中使用 Camel,則它將是OSGI 登錄檔。型別轉換器顧名思義,包含各種已載入的型別轉換器,它們將輸入從一種格式轉換為另一種格式。您可以使用內建的型別轉換器,也可以提供您自己的轉換機制。元件模組包含應用程式使用的元件。元件透過您指定的類路徑上的自動發現來載入。在 OSGI 容器的情況下,這些元件在啟用新捆綁包時載入。我們已經在前面的章節中討論了端點和路由。資料格式模組包含已載入的資料格式,最後語言模組表示已載入的語言。
此處的程式碼片段將讓您瞭解如何在 Camel 應用程式中建立CamelContext:
CamelContext context = new DefaultCamelContext();
try {
context.addRoutes(new RouteBuilder() {
// Configure filters and routes
}
}
);
DefaultCamelContext 類提供了CamelContext 的具體實現。在addRoutes 方法中,我們建立了RouteBuilder 的匿名例項。您可以建立多個RouteBuilder 例項來定義多個路由。同一上下文中的每個路由必須具有唯一的 ID。路由可以在執行時動態新增。具有與先前定義的路由相同的 ID 的路由將替換舊路由。
接下來將介紹RouteBuilder 例項中包含的內容。
路由
路由器定義了將訊息從from 位置移動到to 位置的規則。您可以使用RouteBuilder 在 Java DSL 中定義路由。您可以透過擴充套件內建的RouteBuilder 類來建立路由。路由以from 端點開始,並在一個或多個 to 端點結束。在這兩者之間,您實現處理邏輯。您可以在單個configure 方法中配置任意數量的路由。
這是一個關於如何建立路由的典型示例:
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:DistributeOrderDSL")
.to("stream:out");
}
}
我們覆蓋RouteBuilder 類的 configure 方法,並在其中實現我們的路由和過濾機制。在本例中,我們將從端點DistributeOrderDSL接收到的輸入重定向到控制檯,該控制檯由端點stream:out指定。
語言選擇
您可以使用不同的語言建立路由。以下是一些關於如何在三種不同語言中定義相同路由的示例:
Java DSL
from ("file:/order").to("jms:orderQueue");
Spring DSL
<route> <from uri = "file:/order"/> <to uri = "jms:orderQueue"/> </route>
Scala DSL
from "file:/order" -> "jms:orderQueue"
過濾器
您可以使用過濾器選擇一部分輸入內容。要設定過濾器,您可以使用任何任意的Predicate實現。然後將過濾後的輸入傳送到您所需的目的地端點。在這個例子中,我們過濾掉所有肥皂訂單,以便可以將它們集體傳送給肥皂供應商。
from("direct:DistributeOrderDSL")
.split(xpath("//order[@product = 'soaps']/items"))
.to("stream:out");
在這個例子中,我們使用了xpath謂詞進行過濾。如果您想使用 Java 類進行過濾,請使用以下程式碼:
from("direct:DistributeOrderDSL")
.filter()
.method(new Order(),"filter")
.to("stream:out");
Order 是您具有您自己的過濾機制的自定義 Java 類。
您可以將多個謂詞組合在一個路由中,如下所示:
from("direct:DistributeOrderDSL")
.choice()
.when(header("order").isEqualTo("oil"))
.to("direct:oil")
.when(header("order").isEqualTo("milk"))
.to("direct:milk")
.otherwise()
.to("direct:d");
因此,現在所有“油”訂單將傳送給油供應商,“牛奶”訂單將傳送給牛奶供應商,其餘的將傳送到公共池。
自定義處理器
您也可以使用自定義處理。下面的示例建立了一個名為myCustomProcessor的自定義處理器,並在路由構建器中使用它。
Processor myCustomProcessor = new Processor() {
public void process(Exchange exchange) {
// implement your custom processing
}
};
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("direct:DistributeOrderDSL")
.process(myProcessor);
}
};
您可以將自定義處理器與選擇和過濾結合使用,以更好地控制您的中介和路由:
from("direct:DistributeOrderDSL")
.filter(header("order").isEqualTo("milk"))
.process(myProcessor);
使用 XML
如果您願意,可以使用更龐大的 XML 來定義路由。以下 XML 程式碼片段顯示瞭如何透過 Spring XML 建立路由以及一些過濾:
<camelContext xmlns = "http://camel.apache.org/schema/spring">
<route>
<from uri = "direct:DistributeOrderXML"/>
<log message = "Split by Distribute Order"/>
<split>
<xpath>//order[@product = 'Oil']/items</xpath>
<to uri = "file:src/main/resources/order/"/>
<to uri = "stream:out"/>
</split>
</route>
</camelContext>
瞭解瞭如何構建路由後,我們現在將瞭解建立端點的各種技術。