實現企業整合模式,第 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如果您不習慣使用不斷變化的 codebase,您也可以選擇 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 方法中,訂單被拆分成多個 Drink,框架將這些 Drink 再次包裝成單獨的訊息。

在被拆分並放入 'drinks' 渠道後,這些 Drink 由 DrinksRouter 處理。該路由器負責將熱飲放入 'hotDrinks' 渠道,將冷飲放入 'coldDrinks' 渠道。這兩個渠道分別由不同的端點處理,這些端點呼叫 Barista 上的 prepareHotDrink 和 prepareColdDrink 方法。

讓我們跟隨訊息在相關程式碼片段中的流向:在 cafeDemo.xml bean 定義檔案中,您可以看到 Cafe 被配置為一個 bean。<beans:bean id="cafe" class="org.springframework.integration.samples.cafe.Cafe"> <beans:property name="orderChannel" ref="orders" /> </beans:bean> CafeDemo 的 main 方法使用此 bean 將訂單訊息放入 orders 佇列。 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 作為有效載荷的訊息拆分成多個包含該 Order 的 Drink 的訊息。
@MessageEndpoint(input="orders", output="drinks") public class OrderSplitter {
@Splitter
public List<Drink> split(Message<DrinkOrder> orderMessage) {
	return orderMessage.getPayload().getDrinks();
}

}

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

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

}

路由之後,根據訊息的溫度,訊息將分別在 hotDrinks 或 coldDrinks 渠道上可用。

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

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

請注意,您不需要自己解包訊息:接受有效載荷型別作為輸入引數也是可以的。如果您更改 Barista 中的方法以接受 Message並自行提取有效載荷,它仍會按預期工作。 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 社群所有即將舉行的活動。

檢視全部