實現企業整合模式 第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 包中,您將找到與 著名的星巴克故事 實現相關的所有程式碼。為了向您介紹架構,我將從頭(咖啡館)到尾(咖啡師)地遵循一個訂單

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

拆分並放到“drinks”通道後,飲料由 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> 這個 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 散佈著一些註解

  • 當您開啟 annotation-config 時,@MessageEndpoint 註解告訴 Spring Integration 將這種型別的 bean 包裝在一個端點中。此外,它還是 @Component 的子型別,因此您不需要編寫 xml bean 定義即可讓 Spring 識別它。
  • @Splitter 註解告訴 spring 使用 splitOrder 方法將包含 Order 作為有效負載的訊息拆分為多個包含該 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 知道該怎麼做。

請注意,您不需要自己解包訊息:接受有效負載型別作為輸入引數也可以。如果您更改 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 社群所有即將舉行的活動。

檢視所有