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