實作企業整合模式,第 0 部分

工程 | Iwein Fuld | 2008年5月19日 | ...

在我關於 Spring Integration 的演講之後,我收到了很多關於澄清和範例的問題。為了滿足需求,我將開始一個關於使用 Spring Integration 實作不同整合模式的小系列。第一篇文章將著重於基礎知識。它將向您展示如何啟動並執行,並逐步引導您完成其中一個範例。

如果您以前從未聽說過 Spring Integration,那麼最好先閱讀 Mark Fisher 撰寫的 介紹性部落格 或瀏覽專案網站,以熟悉它。 一般來說

讓我先聲明:您即將在此處看到的模式僅旨在說明 Spring Integration 提供的功能;語法可能因不同版本而異,並且您的系統可能需要額外的預防措施。

參與 Spring Integration 的第一步是下載專案並查看範例。那麼,讓我們從這裡開始

  1. 從 svn 檢出原始碼svn co https://src.springframework.org/svn/spring-integration/trunk如果您不習慣使用不斷變化的程式碼庫,您也可以選擇 https://src.springframework.org/svn/spring-integration/tags/ 下的里程碑版本之一,但在此部落格撰寫時,M4 尚未發布,我仍然想向您展示最新的功能。當您閱讀本文時,別忘了檢查 M4 是否已經發布。上次我檢查時,它即將發布。
  2. 在整個專案上執行建置
    $ cd build-spring-integration
    $ ant
  3. 在 Eclipse 中匯入專案並配置 IVY_CACHE 變數以指向您的 ivy 快取。這可能是一個與 build-spring-integration 相鄰的目錄。
  4. 開啟 HelloWorldDemo 並以 Java 應用程式身分執行。如果您之前 做過,您將看到語法的變化。
如果這一切運作正常,您就已經啟動並執行了。接下來,您可以探索不同的範例。我將僅描述 cafe 範例,因為它是最有趣的配置。

在範例專案的 cafe 套件中,您將找到所有與 著名的星巴克故事 實作相關的程式碼。為了向您介紹架構,我將追蹤從開始 (Cafe) 到結束 (Barista) 的訂單流程

首先,訂單由 CafeDemo 建立。它包含兩種飲品,一種熱飲,一種冷飲。然後,訂單被包裝在訊息中並放置在 'orders' 通道上。監聽 'orders' 通道的端點是一個分割器 (OrderSplitter),在 split 方法中,訂單被分割成多個 Drinks,這些 Drinks 又被框架包裝成單獨的訊息。

在被分割並放置在 'drinks' 通道上之後,飲品將由 DrinksRouter 處理。此路由器負責將熱飲放置在 'hotDrinks' 通道上,將冷飲放置在 'coldDrinks' 通道上。這兩個通道都由不同的端點處理,這些端點分別使用 Barista 上的 prepareHotDrink 和 preprareColdDrink 方法。

讓我們跟隨訊息流經相關的程式碼片段:在 cafeDemo.xml bean 定義檔中,您可以看到 Cafe 被配置為一個 bean。 <beans:bean id="cafe" class="org.springframework.integration.samples.cafe.Cafe"> <beans:property name="orderChannel" ref="orders" /> </beans:bean> 此 bean 由 CafeDemo main 方法用於將訂單訊息放置在訂單佇列中。 Cafe cafe = (Cafe) context.getBean("cafe"); DrinkOrder order = new DrinkOrder(); Drink hotDoubleLatte = new Drink(DrinkType.LATTE, 2, false); Drink icedTripleMocha = new Drink(DrinkType.MOCHA, 3, true); order.addDrink(hotDoubleLatte); order.addDrink(icedTripleMocha); for (int i = 0; i < 100; i++) { cafe.placeOrder(order); }

A<context:component-scan ...../>正在使用於cafeDemo.xml以引導 OrderSplitter 和 DrinkRouter。

OrderSplitter 灑上了一些註解

  • @MessageEndpoint 註解告訴 Spring Integration 在您開啟 annotation-config 時,將此類型的 bean 包裝在端點中。此外,它是 @Component 的子類型,因此您不需要編寫 xml bean 定義即可讓 Spring 拾取它。
  • @Splitter 註解告訴 Spring 使用 splitOrder 方法將包含 Order 作為 payload 的訊息分割成多個包含該 Order 的飲品的訊息。
@MessageEndpoint(input="orders", output="drinks") public class OrderSplitter {
@Splitter
public List<Drink> split(Message<DrinkOrder> orderMessage) {
	return orderMessage.getPayload().getDrinks();
}

}

DrinkRouter 也以類似的方式裝飾了註解,這些註解告訴 Spring Integration 將其用作路由器。從 @Router 註解方法傳回的字串被 Spring Integration 解釋為輸出通道。 @MessageEndpoint(input="drinks") public class DrinkRouter {

@Router
public String resolveDrinkChannel(Drink drink) {
	return (drink.isIced()) ? "coldDrinks" : "hotDrinks";
}

}

路由之後,訊息會根據其溫度在 hotDrinks 或 coldDrinks 通道上可用。

配置為呼叫 Barista 上適當方法的端點在 xml 中配置:

您可以看到輸入通道和饋送訊息的方法都已定義,因此 Spring Integration 知道該怎麼做。

請注意,您不需要自己解包訊息:接受 payload 類型作為輸入參數也可以。如果您將 Barista 中的方法變更為接受 Message並自行提取 payload,它仍然會如預期般運作。 public void prepareColdDrink(Message drinkMessage) { Drink drink = drinkMessage.getPayload(); //no changes to the rest of the code }

試玩一下範例,如果您有任何問題,請在論壇上發文。您會發現他們已經非常樂於助人(主要是因為 Mark 回覆幾乎每篇文章)。下一集將介紹 EIP 的另一個實作。

取得 Spring 電子報

與 Spring 電子報保持聯繫

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進展。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中為 OpenJDK™、Spring 和 Apache Tomcat® 提供支援和二進位檔案。

了解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

查看全部