搶佔先機
VMware 提供培訓和認證,助力您的快速進步。
瞭解更多在我關於 Spring Integration 的演講之後,我收到了很多關於澄清和示例的問題。為了滿足需求,我將開始一個小型系列,介紹如何使用 Spring Integration 實現不同的整合模式。第一篇文章將重點介紹基礎知識。它將向您展示如何啟動並執行,並逐步講解其中一個示例。
如果您之前從未聽說過 Spring Integration,那麼最好先透過閱讀 Mark Fisher 撰寫的介紹性部落格 或瀏覽專案網站來熟悉它。總的來說
首先讓我宣告一點:您在此看到的模式僅用於說明 Spring Integration 提供的功能;語法可能因不同版本而異,並且您的系統可能需要額外的預防措施。
參與 Spring Integration 的第一步是下載專案並檢視示例。所以讓我們從這裡開始
在示例專案的 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(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
嘗試執行示例,如果您遇到任何問題,請在論壇上發帖。您會發現它們已經非常有幫助(主要是因為 Mark 回覆了幾乎所有帖子)。下一集將介紹另一種 EIP 的實現。