領先一步
VMware 提供培訓和認證,以加速您的進展。
了解更多Spring Integration 使用 Spring 程式設計模型實作企業整合模式,以在基於 Spring 的應用程式中啟用訊息傳遞。Spring Integration 也提供與外部系統的整合,使用宣告式配接器支援 jms、http、amqp、tcp、ftp(s)、smtp 等。目前,訊息流程的配置主要透過 Spring XML 完成,Spring Integration 支援多個命名空間,以盡可能簡潔地完成此操作。今年稍早,SpringSource 發布了用於 Spring Integration 的 Scala DSL。現在,我們很高興宣布 Groovy DSL 的第一個里程碑版本 (1.0.0.M1) 發布。
這兩個 DSL 都有一個共同目標 - 為 Spring Integration 提供 XML 配置的強大且彈性的替代方案。這兩種語言在語義上也相似,因為 Groovy DSL 借鑒了 Scala DSL 引入的概念。此外,兩者本質上都是 Spring Integration 之上的外觀模式。然而,相似之處到此為止。許多差異可以歸因於 Scala 和 Groovy 之間的語言差異,最顯著的是靜態與動態類型。Groovy DSL 主要針對 Groovy 開發者,他們熟悉 DSL 所基於的 builder 模式的階層式語法。這也應該會吸引 Java 開發人員,他們可以利用 DSL 提供的豐富功能,並且會發現語法非常平易近人。
def builder = new IntegrationBuilder()
def flow = builder.messageFlow {
transform {"hello, $it"}
handle {println it}
}
flow.send('world')
這會建立一個 Spring 應用程式上下文,建構一個 Spring Integration 訊息流程,其中包含一個轉換器 (transform) 和一個服務啟動器 (handle),並將這些端點與直接通道連接,以便它們依序執行。轉換器將訊息酬載(在此例中為 "world")附加到字串 "hello, ",而服務啟動器將結果列印到 STDOUT。瞧!在這裡我們看到 builder 模式的一個簡單實例。對於那些不熟悉 Groovy 的人來說,這是有效的 Groovy 語法。messageFlow、transform 和 handle 都是 DSL 定義的方法。{} 是 closure 的 Groovy 語法。由於括號和分號在 Groovy 中是可選的,因此這等效於
def flow = builder.messageFlow({
transform({"hello, $it"});
handle({println(it)});
});
另外,我應該提到,預設情況下,Groovy closures 期望一個名為 'it' 的單一引數。Closure 引數可以命名並選擇性地輸入類型。例如
transform {String payload -> "hello, $payload"}
還有一件事。Groovy 允許您在雙引號字串中嵌入變數表達式。這並非旨在成為 Groovy 教學,但只要說 Groovy 的所有語法糖都使程式碼非常簡潔、簡明且易於閱讀就足夠了。順便說一句,此範例的等效 XML 如下
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:si="http://www.springframework.org/schema/integration" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd">
<si:transformer id="t1" input-channel="flow1.inputChannel" output-channel="sa1.inputChannel" expression="'Hello,' + payload"/>
<si:service-activator id="sa1" input-channel="sa.inputChannel" expression = "T(java.lang.System).out.println(payload)"/>
</beans>
然後我們必須編寫大約十行程式碼來初始化 Spring 應用程式上下文並傳送訊息。
若要在 Java 中執行 DSL 範例,有幾種選項。一種方法是載入並執行外部 DSL 腳本
HelloWorld.groovy
messageFlow {
transform {"hello, $it"}
handle {println it}
}
Main.java
public class Main {
public static void main(String[] args) {
IntegrationBuilder builder = new IntegrationBuilder();
MessageFlow flow = (MessageFlow) builder.build(new File("HelloWorld.groovy"));
flow.send("world");
}
}
除了上面顯示的 File 實例之外,build() 方法也接受 InputStream、GroovyCodeSource、Spring Resource,甚至是 groovy.lang.Script。因此,如果您使用 Groovy 編譯器編譯專案,您可以執行類似這樣的操作,其中 HelloWorld 是 groovy.lang.Script 的實例。
public class Main {
public static void main(String[] args) {
IntegrationBuilder builder = new IntegrationBuilder();
MessageFlow flow = (MessageFlow) builder.build(new HelloWorld()));
flow.send("world");
}
}