Groovy サポート

Spring Integration 2.0 では、Groovy サポートを追加しました。これにより、Groovy スクリプト言語を使用して、さまざまな統合コンポーネントのロジックを提供できます。これは、ルーティング、変換、その他の統合に関する Spring 式言語(SpEL)のサポート方法と同様です。Groovy の詳細については、プロジェクトの Web サイト (英語) にある Groovy のドキュメントを参照してください。

この依存関係をプロジェクトに含める必要があります。

<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-groovy</artifactId>
    <version>6.3.1</version>
</dependency>
compile "org.springframework.integration:spring-integration-groovy:6.3.1"

さらに、バージョン 6.0 から、統合フロー構成用の Groovy DSL が提供されます。

Groovy の設定

Spring Integration 2.1 では、Groovy サポートの構成名前空間は Spring Integration のスクリプトサポートの拡張であり、スクリプトのサポートセクションで詳細に説明されているコア構成と動作を共有します。Groovy スクリプトは汎用スクリプトサポートによって十分にサポートされていますが、Groovy サポートは、Spring Framework の org.springframework.scripting.groovy.GroovyScriptFactory および関連コンポーネントによってサポートされる Groovy 構成名前空間を提供し、Groovy を使用するための拡張機能を提供します。次のリストは、2 つの構成例を示しています。

フィルター
<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>

上記の例が示すように、構成は一般的なスクリプトサポート構成と同じに見えます。唯一の違いは、int-groovy 名前空間プレフィックスによって示されるように、Groovy 名前空間の使用です。また、<script> タグの lang 属性は、このネームスペースでは無効であることに注意してください。

Groovy オブジェクトのカスタマイズ

Groovy オブジェクト自体を(変数の設定以外に)カスタマイズする必要がある場合は、customizer 属性を使用して、GroovyObjectCustomizer を実装する Bean を参照できます。例: これは、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 には、variable 要素と連動する variables 属性が導入されました。また、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 コードに変換およびコンパイルされ、getProperty() ファクトリや CallSite プロキシなどの Groovy 呼び出しの動的フェーズをバイパスします。

バージョン 4.3 以降では、@CompileStatic の ASTTransformationCustomizer を内部 CompilerConfiguration に追加するように指定して、compile-staticboolean オプションを使用して Spring Integration Groovy コンポーネントを構成できます。これが適切な場所にあると、スクリプトコードで @CompileStatic を使用したメソッド宣言を省略しても、コンパイルされたプレーン Java コードを取得できます。この場合、次の例に示すように、前述のスクリプトは短くてもかまいませんが、解釈されたスクリプトよりも少し冗長である必要があります。

binding.variables.headers.type == 'good'

@CompileStatic には動的 GroovyObject.getProperty() 機能がないため、groovy.lang.Scriptbinding プロパティを介して headers および payload (またはその他の)変数にアクセスする必要があります。

さらに、compiler-configuration Bean リファレンスを導入しました。この属性を使用すると、ImportCustomizer など、他の必要な Groovy コンパイラーのカスタマイズを提供できます。この機能の詳細については、Groovy の高度なコンパイラー構成 (英語) に関する資料を参照してください。

compilerConfiguration を使用しても、@CompileStatic アノテーションに ASTTransformationCustomizer は自動的に追加されず、compileStatic オプションをオーバーライドします。それでも CompileStatic が必要な場合は、new ASTTransformationCustomizer(CompileStatic.class) をそのカスタム compilerConfiguration の CompilationCustomizers に手動で追加する必要があります。
Groovy コンパイラーのカスタマイズは refresh-check-delay オプションに影響を与えず、再ロード可能なスクリプトも静的にコンパイルできます。

制御バス

エンタープライズ統合パターン (英語) )に従って、コントロールバスの背景となる考え方は、「アプリケーションレベル」のメッセージングに使用されるのと同じメッセージングシステムをフレームワーク内のコンポーネントの監視および管理に使用できるということです。Spring Integration では、公開された操作を呼び出す手段としてメッセージを送信できるように、前述のアダプターに基づいて構築します。これらの操作の 1 つのオプションは Groovy スクリプトです。次の例では、制御バスの Groovy スクリプトを構成します。

<int-groovy:control-bus input-channel="operationChannel"/>

制御バスには、アプリケーションコンテキストで Bean の操作を呼び出すためにアクセスできる入力チャネルがあります。

Groovy 制御バスは、Groovy スクリプトとして入力チャネルでメッセージを実行します。メッセージを受け取り、本文をスクリプトにコンパイルし、GroovyObjectCustomizer でカスタマイズして実行します。制御バスの MessageProcessor は、@ManagedResource アノテーションが付けられ、Spring の Lifecycle インターフェースを実装するか、Spring の CustomizableThreadCreator 基本クラス(たとえば、TaskExecutor および TaskScheduler 実装のいくつか)を継承するアプリケーションコンテキストのすべての Bean を公開します。

特に非同期メッセージフロー内で、コントロールバスコマンドスクリプトでカスタムスコープ(「リクエスト」など)でマネージド 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"/>