Spring Integration:Spring 產品組合中的新成員

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

昨天上午,我在The Spring Experience上進行了兩次演講,主題是“使用Spring進行企業整合模式”。第一次演講概述了Spring對企業整合的核心支援,包括JMS、遠端呼叫、JMX、排程和郵件。該演講還高階討論了幾種由Gregor Hohpe和Bobby Woolf合著的同名書籍中介紹的企業整合模式。在第二次演講中,我正式推出了“Spring Integration”,這是Spring產品組合中的一個新成員。Spring Integration建立在Spring的核心支援之上,提供了一個更高層次的抽象,很大程度上受到這些模式的啟發。在這裡,我想簡要概述一下我在該會議上討論的主題。你也可以閱讀昨天在eWeekInfoWorld上發表的兩篇關於Spring Integration的文章。

首先,我描述了Spring Integration的目標和動機——即實現模型應該簡單且非侵入性——與核心Spring原則保持哲學上的一致性。業務元件應該與底層訊息傳遞基礎設施解耦,從而可以獨立進行測試。該框架應該隱藏執行緒管理的複雜性,同時仍然能夠完全配置執行緒池、佇列容量和排程引數。應提供自定義擴充套件點作為定義明確的策略介面。應該可以使用動態語言來實現整合邏輯,如路由和轉換。配置選項應包括通用XML、特定於域的名稱空間支援和註解。在構建這些核心Spring原則的同時,實現將利用核心Spring功能,包括生命週期管理、任務執行、面向切面的程式設計、事務管理、動態語言支援、JMS、遠端呼叫、郵件和排程。

透過遵循這些目標和動機,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是一個通用介面,為轉換器、路由器以及任何“處理”入站Message的元件提供基礎。


public interface MessageHandler {
    Message handle(Message message);
}

Channel Adapters用於向外部資料來源傳送和從外部資料來源接收。例如,要傳送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來發布方法的返回值。它還將支援其他Advice型別,如“before”和“after-throwing”。

上面的示例基於Spring Integration的0.5版本。因此,這些介面和註解可能會發生變化。事實上,在這個早期階段,我們特別關注反饋。我已經在The Spring Experience上與與會者進行了一些有趣的討論,他們對這個新產品的前景非常興奮。1.0 Milestone 1版本將於1月初發布,1.0最終版本將於2008年第二季度釋出。1.0最終版本將支援多種配置格式(XML、名稱空間和註解)、點對點和釋出/訂閱通道,以及多個介面卡(最少包括:JMS、RMI、HttpInvoker、Hessian/Burlap、File、EMail、JDBC、stream和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 社群所有即將舉行的活動。

檢視所有