Groovy 支援
在 Spring Integration 2.0 中,我們新增了 Groovy 支援,讓您可以使用 Groovy 腳本語言為各種整合元件提供邏輯 — 類似於 Spring 運算式語言 (SpEL) 對於路由、轉換和其他整合問題的支援方式。如需更多關於 Groovy 的資訊,請參閱 Groovy 文件,您可以在專案網站上找到。
您需要將此相依性包含到您的專案中
-
Maven
-
Gradle
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-groovy</artifactId>
<version>6.3.5</version>
</dependency>
compile "org.springframework.integration:spring-integration-groovy:6.3.5"
此外,從 6.0 版開始,還提供了用於整合流程設定的 Groovy DSL。
Groovy 設定
在 Spring Integration 2.1 中,Groovy 支援的設定命名空間是 Spring Integration 腳本支援的擴充,並共用 腳本支援 區段中詳細描述的核心設定和行為。即使通用腳本支援已良好地支援 Groovy 腳本,Groovy 支援仍提供 Groovy
設定命名空間,該命名空間由 Spring Framework 的 org.springframework.scripting.groovy.GroovyScriptFactory
和相關元件支援,為使用 Groovy 提供擴充的功能。以下列表顯示了兩個範例設定
<int:filter input-channel="referencedScriptInput">
<int-groovy:script location="some/path/to/groovy/file/GroovyFilterTests.groovy"/>
</int:filter>
<int:filter input-channel="inlineScriptInput">
<int-groovy:script><![CDATA[
return payload == 'good'
]]></int-groovy:script>
</int:filter>
如先前的範例所示,設定看起來與通用腳本支援設定相同。唯一的區別是使用了 Groovy 命名空間,如 int-groovy
命名空間前綴所示。另請注意,<script>
標籤上的 lang
屬性在此命名空間中無效。
Groovy 物件自訂
如果您需要自訂 Groovy 物件本身(除了設定變數之外),您可以參考實作 GroovyObjectCustomizer
的 bean,方法是使用 customizer
屬性。例如,如果您想透過修改 MetaClass
並註冊要在腳本中可用的函數來實作特定領域語言 (DSL),這可能會很有用。以下範例顯示如何執行此操作
<int:service-activator input-channel="groovyChannel">
<int-groovy:script location="somewhere/SomeScript.groovy" customizer="groovyCustomizer"/>
</int:service-activator>
<beans:bean id="groovyCustomizer" class="org.something.MyGroovyObjectCustomizer"/>
設定自訂 GroovyObjectCustomizer
並不與 <variable>
元素或 script-variable-generator
屬性互斥。它也可以在定義內嵌腳本時提供。
Spring Integration 3.0 引入了 variables
屬性,該屬性與 variable
元素結合使用。此外,如果沒有提供具有名稱的綁定變數,groovy 腳本能夠將變數解析為 BeanFactory
中的 bean。以下範例顯示如何使用變數 (entityManager
)
<int-groovy:script>
<![CDATA[
entityManager.persist(payload)
payload
]]>
</int-groovy:script>
entityManager
必須是應用程式環境定義中的適當 bean。
有關 <variable>
元素、variables
屬性和 script-variable-generator
屬性的更多資訊,請參閱 腳本變數綁定。
Groovy 腳本編譯器自訂
@CompileStatic
提示是最流行的 Groovy 編譯器自訂選項。它可以在類別或方法層級上使用。如需更多資訊,請參閱 Groovy 參考手冊,特別是 @CompileStatic。為了在簡短腳本(在整合情境中)中利用此功能,我們被迫將簡單腳本更改為更像 Java 的程式碼。請考慮以下 <filter>
腳本
headers.type == 'good'
先前的腳本在 Spring Integration 中變為以下方法
@groovy.transform.CompileStatic
String filter(Map headers) {
headers.type == 'good'
}
filter(headers)
這樣,filter()
方法被轉換並編譯為靜態 Java 程式碼,繞過 Groovy 動態調用階段,例如 getProperty()
工廠和 CallSite
代理。
從 4.3 版開始,您可以使用 compile-static
boolean
選項設定 Spring Integration Groovy 元件,指定應將 @CompileStatic
的 ASTTransformationCustomizer
新增至內部 CompilerConfiguration
。完成設定後,您可以省略腳本程式碼中具有 @CompileStatic
的方法宣告,並且仍然獲得編譯後的純 Java 程式碼。在這種情況下,先前的腳本可以很短,但仍然需要比直譯腳本更詳細,如下列範例所示
binding.variables.headers.type == 'good'
您必須透過 groovy.lang.Script
binding
屬性存取 headers
和 payload
(或任何其他)變數,因為使用 @CompileStatic
,我們沒有動態 GroovyObject.getProperty()
功能。
此外,我們引入了 compiler-configuration
bean 參考。使用此屬性,您可以提供任何其他需要的 Groovy 編譯器自訂設定,例如 ImportCustomizer
。有關此功能的更多資訊,請參閱 Groovy 文件,了解 進階編譯器設定。
使用 compilerConfiguration 不會自動為 @CompileStatic 註解新增 ASTTransformationCustomizer ,並且會覆寫 compileStatic 選項。如果您仍然需要 CompileStatic ,您應該手動將 new ASTTransformationCustomizer(CompileStatic.class) 新增到該自訂 compilerConfiguration 的 CompilationCustomizers 中。 |
Groovy 編譯器自訂設定對 refresh-check-delay 選項沒有任何影響,並且可重新載入的腳本也可以靜態編譯。 |
控制匯流排
如 (企業整合模式) 中所述,控制匯流排背後的想法是,您可以將相同的訊息傳遞系統用於監控和管理框架內的元件,就像用於「應用程式層級」訊息傳遞一樣。在 Spring Integration 中,我們建立在先前描述的配接器之上,以便您可以傳送訊息作為調用公開操作的方式。這些操作的一個選項是 Groovy 腳本。以下範例為控制匯流排設定 Groovy 腳本
<int-groovy:control-bus input-channel="operationChannel"/>
控制匯流排具有一個輸入通道,可以存取該通道以調用應用程式環境定義中 bean 的操作。
Groovy 控制匯流排在輸入通道上將訊息作為 Groovy 腳本執行。它接收訊息,將主體編譯為腳本,使用 GroovyObjectCustomizer
自訂它,然後執行它。控制匯流排的 MessageProcessor
公開應用程式環境定義中所有使用 @ManagedResource
註解並實作 Spring 的 Lifecycle
介面或擴充 Spring 的 CustomizableThreadCreator
基底類別(例如,多個 TaskExecutor
和 TaskScheduler
實作)的 bean。
請注意,在控制匯流排的命令腳本中,尤其是在非同步訊息流程中,謹慎使用具有自訂範圍(例如 'request')的受管理 bean。如果控制匯流排的 MessageProcessor 無法從應用程式環境定義中公開 bean,您可能會在命令腳本執行期間遇到一些 BeansException 。例如,如果未建立自訂範圍的環境定義,則嘗試取得該範圍內的 bean 會觸發 BeanCreationException 。 |
如果您需要進一步自訂 Groovy 物件,您還可以透過 customizer
屬性提供對實作 GroovyObjectCustomizer
的 bean 的參考,如下列範例所示
<int-groovy:control-bus input-channel="input"
output-channel="output"
customizer="groovyCustomizer"/>
<beans:bean id="groovyCustomizer" class="org.foo.MyGroovyObjectCustomizer"/>