Spring Integration 的 Groovy DSL

工程 | David Turanski | 2012 年 11 月 6 日 | ...

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 的 構建器模式 的分層語法感到自在。這對於 Java 開發人員也很有吸引力,他們可以利用 DSL 提供的豐富功能,並且會發現該語法非常易於理解。

Hello World

讓我們從一個 Groovy 示例開始

def builder = new IntegrationBuilder()

def flow = builder.messageFlow {
   transform {"hello, $it"}
   handle {println it}
}

flow.send('world')

這會建立一個 Spring 應用程式上下文,構建一個 Spring Integration 訊息流,該訊息流由一個轉換器 (transform) 和一個服務啟用器 (handle) 組成,並使用直接通道連線這些端點,以便它們按順序執行。轉換器將訊息負載(在這種情況下是“world”)附加到字串“hello, ”,服務啟用器將結果列印到標準輸出。瞧!這裡我們看到了構建器模式的一個簡單例項。對於不熟悉 Groovy 的人來說,這是有效的 Groovy 語法。messageFlowtransformhandle 都是 DSL 定義的方法。{} 是 Groovy 的閉包語法。由於括號和分號在 Groovy 中是可選的,這等同於


def flow = builder.messageFlow({
   transform({"hello, $it"});
   handle({println(it)});
});

此外,我應該提到,Groovy 閉包預設期望一個名為 'it' 的引數。閉包引數可以命名並可選地進行型別化。例如


   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");
    }
}

下一步

希望這個簡短的介紹說明了 DSL 的易用性。如果您想更深入地瞭解,spring-integration-dsl-groovy Github 倉庫 包含一份 DSL 使用者指南,其中包含大量示例,更詳細地描述了 DSL 的功能。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有