Apache Camel - CamelContext



CamelContext 提供了對 Camel 中所有其他服務的訪問,如下圖所示:

CamelContext

讓我們看看各種服務。登錄檔模組預設情況下是 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>

瞭解瞭如何構建路由後,我們現在將瞭解建立端點的各種技術。

廣告
© . All rights reserved.