Spring Integration:Spring 家族的新成員

工程 | Mark Fisher | 2007年12月14日 | ...

昨天早上,我在 The Spring Experience 會議上做了兩個部分的演講,題為“使用 Spring 實現企業整合模式”。第一個演講概述了 Spring 對企業整合的核心支援,包括 JMS、remoting、JMX、排程和電子郵件。該演講還高級別討論了 Gregor Hohpe 和 Bobby Woolf 在同名書籍中介紹的幾種企業整合模式。在第二個演講中,我正式釋出了“Spring Integration”,這是 Spring 家族的新成員。Spring Integration 在 Spring 的核心支援基礎上構建,並提供了很大程度上受這些模式啟發的更高抽象層次。在此,我想簡要回顧一下我在該演講中討論的主題。您還可以閱讀昨天發表在 eWeekInfoWorld 上的兩篇關於 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=&ldquo;inputChannel&rdquo;, defaultOutput=&ldquo;outputChannel&rdquo;)&rdquo;
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)&rdquo;
    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=&ldquo;testChannel&rdquo;)&rdquo;
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。

請繼續關注本部落格,未來幾天將釋出更多資訊,包括程式碼倉庫的公開可用性。另外,務必閱讀昨天發表在 eWeekInfoWorld 上的那些文章。

訂閱 Spring 新聞通訊

訂閱 Spring 新聞通訊,保持聯絡

訂閱

搶佔先機

VMware 提供培訓和認證,助您加速發展。

瞭解更多

獲取支援

Tanzu Spring 透過一項簡單的訂閱,為 OpenJDK™、Spring 和 Apache Tomcat® 提供支援和二進位制檔案。

瞭解更多

近期活動

檢視 Spring 社群的所有近期活動。

檢視全部