領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多昨天上午,我在The Spring Experience上進行了兩次演講,主題是“使用Spring進行企業整合模式”。第一次演講概述了Spring對企業整合的核心支援,包括JMS、遠端呼叫、JMX、排程和郵件。該演講還高階討論了幾種由Gregor Hohpe和Bobby Woolf合著的同名書籍中介紹的企業整合模式。在第二次演講中,我正式推出了“Spring Integration”,這是Spring產品組合中的一個新成員。Spring Integration建立在Spring的核心支援之上,提供了一個更高層次的抽象,很大程度上受到這些模式的啟發。在這裡,我想簡要概述一下我在該會議上討論的主題。你也可以閱讀昨天在eWeek和InfoWorld上發表的兩篇關於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=“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來發布方法的返回值。它還將支援其他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。
請繼續關注此部落格,瞭解未來幾天更多資訊,包括程式碼倉庫的公開可用性。另外,請務必閱讀昨天在eWeek和InfoWorld上發表的文章。