搶佔先機
VMware 提供培訓和認證,助您加速發展。
瞭解更多昨天早上,我在 The Spring Experience 會議上做了兩個部分的演講,題為“使用 Spring 實現企業整合模式”。第一個演講概述了 Spring 對企業整合的核心支援,包括 JMS、remoting、JMX、排程和電子郵件。該演講還高級別討論了 Gregor Hohpe 和 Bobby Woolf 在同名書籍中介紹的幾種企業整合模式。在第二個演講中,我正式釋出了“Spring Integration”,這是 Spring 家族的新成員。Spring Integration 在 Spring 的核心支援基礎上構建,並提供了很大程度上受這些模式啟發的更高抽象層次。在此,我想簡要回顧一下我在該演講中討論的主題。您還可以閱讀昨天發表在 eWeek 和 InfoWorld 上的兩篇關於 Spring Integration 的文章。
首先,我闡述了 Spring Integration 的目標和動機——即實現模型應該簡單且無侵入性,從而與核心 Spring 原則保持哲學上的一致性。業務元件應與底層訊息基礎設施解耦,從而能夠獨立測試。框架應隱藏執行緒管理的複雜性,同時仍然允許完全配置執行緒池、佇列容量和排程引數。定製擴充套件點應以良好定義的策略介面形式提供。應可能使用動態語言來實現整合邏輯,例如路由和轉換。配置選項應包括通用 XML、特定領域名稱空間支援和註解。在這些核心 Spring 原則的基礎上,實現將利用核心 Spring 特性,包括生命週期管理、任務執行、面向切面程式設計、事務管理、動態語言支援、JMS、remoting、郵件和排程。
遵循這些目標和動機,Spring Integration 將簡化企業整合解決方案的開發。由於概念和實現如此一致,這將方便那些開始探索 SOA 和 EDA 的現有 Spring 使用者逐步採用。最後,作為 Spring 家族的一員,它將與 Spring 家族中的其他產品提供無縫相容和及時的協同演進。
在討論了這些目標和動機之後,我介紹了 API。核心元件是 Message、MessageChannel 和 MessageEndpoint。Message 是任何型別資料的容器,同時也是一個包含常見訊息屬性(ID、關聯 ID、過期時間、返回地址、序列資訊等)的訊息頭。MessageChannel 提供傳送和接收方法,這些方法接受超時引數。接收方法還接受一個 MessageSelector,它有一個方法:boolean accept(Message message)。這是 MessageChannel 的基本介面定義。
public interface MessageChannel {
boolean send(Message message);
boolean send(Message message, long timeout);
Message receive();
Message receive(long timeout);
Message receive(MessageSelector selector);
Message receive(MessageSelector selector, long timeout);
}
MessageEndpoint 連線一個 MessageHandler 到一個入站 MessageChannel 和/或一個出站 MessageChannel。MessageHandler 是一個通用介面,為轉換器、路由器以及任何其他處理傳入訊息的元件提供了基礎。
public interface MessageHandler {
Message handle(Message message);
}
Channel Adapter 用於與外部資料來源進行傳送和接收。例如,要傳送 JMS 訊息,提供了 OutboundJmsChannelAdapter。在配置訊息系統時,可以像向其他通道傳送訊息一樣向該介面卡傳送訊息。MessageBus 將各種端點和通道連線起來。這與 Spring ApplicationContext 連線物件的方式一致。實際上,MessageBus 本身是一個 ApplicationContextAware 物件,並從其上下文中檢測各種訊息元件。這與 Spring MVC 應用程式中 DispatcherServlet 的行為非常相似。Spring Integration 的名稱空間支援提供了一種簡潔的方式來配置元件。
<integration:message-bus/>
<integration:channel id="quotes"/>
<integration:endpoint input-channel="quotes" handler-ref="logger" handler-method="log">
<integration:consumer period="1000"/>
</integration:endpoint>
另外,還支援註解。
@MessageEndpoint(input=“inputChannel”, defaultOutput=“outputChannel”)”
public class SimpleAnnotatedEndpoint {
@Handler
public String sayHello(String name) {
return "Hello " + name;
}
}
轉換和路由的註解(例如 @Router、@Splitter 和 @Aggregator)也將得到支援。此外,還可以使用註解建立“通道介面卡”,例如用於輸入的 @Polled 和用於輸出的 @DefaultOutput(如果處理器返回訊息且該訊息未提供自己的“返回地址”)。例如,以下端點將每隔 5 秒列印“Hello World”。
@MessageEndpoint
public class SampleAnnotatedEndpoint {
@Polled(period=5000)”
public String getName() {
return "World";
}
@Handler
public String sayHello(String name) {
return "Hello " + name;
}
@DefaultOutput
public void display(String message) {
System.out.println(message);
}
}
@MessageEndpoint 也與 Spring 2.5 的新元件檢測能力“開箱即用”。因此,上述示例根本不需要任何 XML 配置。對於為單個方法建立端點而言,更簡單的方式是使用該方法上的 @Subscriber 註解。
@Subscriber(channel=“testChannel”)”
public void test(String s) {
â¦
}
該註解和相應的 @Publisher 都可以透過 Spring Integration 名稱空間中的一個 'annotation-driven' 元素啟用。@Publisher 基於 Spring AOP 構建,用於釋出方法的返回值。它還將支援其他通知型別,例如 'before' 和 'after-throwing'。
上述示例基於 Spring Integration 的 0.5 版本。因此,這些介面和註解可能會發生變化。事實上,我們特別希望在此早期階段獲得反饋。我已經在這裡的 The Spring Experience 會議上與幾位與會者進行了有趣的討論,他們對這項新功能感到非常興奮。1.0 里程碑 1 版本將於一月初發布,1.0 正式版將於 2008 年第二季度釋出。1.0 正式版將支援多種配置格式(XML、名稱空間和註解)、點對點和釋出/訂閱通道,以及多種介面卡(最少包括:JMS、RMI、HttpInvoker、Hessian/Burlap、File、電子郵件、JDBC、流和 Spring ApplicationEvents)。它還將與 Spring 的事務管理和動態語言支援無縫協作。最後,它將與 Spring 家族中的其他產品整合,例如 Spring Web Services、Spring Web Flow、Spring MVC、Spring Batch 和 Spring Security。當然,我們還將與 Spring Dynamic Modules 專案密切合作,使訊息元件支援 OSGi。
請繼續關注本部落格,未來幾天將釋出更多資訊,包括程式碼倉庫的公開可用性。另外,務必閱讀昨天發表在 eWeek 和 InfoWorld 上的那些文章。