Groovy DSL

Groovy DSL は Java DSL のラッパーおよび拡張です。ここで追求する主なゴールは、既存の Java DSL および一部の Groovy 拡張機能または言語固有の構造との相互運用性により、Groovy での Spring Integration 開発を可能な限りスムーズかつ簡単にすることです。実装は Groovy サポートモジュールの一部です。

開始するために必要なのは、import static org.springframework.integration.groovy.dsl.IntegrationGroovyDsl.integrationFlow (Groovy DSL のオーバーロードされたファクトリメソッドを含むクラス) のインポートだけです。

ラムダとしての IntegrationFlow 定義の場合、通常は Groovy から他に何も必要とせず、次のように Bean を宣言します。

@Bean
IntegrationFlow oddFlow() {
    { IntegrationFlowDefinition flow ->
	    flow.handle(Object, { p, h -> 'odd' })
    }
}

この場合、Groovy は、クロージャを IntegrationFlow 匿名インスタンスに変換する必要があることを理解し、ターゲットの Java DSL プロセッサーはこの構造を Java オブジェクトに適切に解析します。

上記の構成の代替として、および以下で説明するユースケースとの一貫性のために、spring-integration-groovy モジュールは、ビルダーパターンスタイルで統合フローを宣言するための Groovy 固有の DSL を提供します。

@Bean
flowLambda() {
    integrationFlow {
        filter String, { it == 'test' }, { id 'filterEndpoint' }
        wireTap integrationFlow {
            channel { queue 'wireTapChannel' }
        }
        delay {
		    messageGroupId 'delayGroup'
		    defaultDelay 100
        }
        transform {
		    transformer { it.toUpperCase() }
            expectedType String
        }
    }
}

このようなグローバル integrationFlow() 関数は、GroovyIntegrationFlowDefinition ( IntegrationFlowDefinition の Groovy ラッパー) のビルダースタイルでのクロージャーを想定し、通常の IntegrationFlow ラムダ実装を生成します。以下のオーバーロードされた integrationFlow() バリアントをさらに参照してください。

他の多くのシナリオでは、データのソースから IntegrationFlow を開始する必要があります (例: JdbcPollingChannelAdapterJmsInboundGateway または既存の MessageChannel)。この目的のために、Spring Integration Java DSL は、オーバーロードされた多数の from() メソッドを含む IntegrationFlow ファクトリを提供します。このファクトリは groovy でも使用できます。

@Bean
flowFromSupplier() {
    IntegrationFlow.fromSupplier({ 'bar' }) { e -> e.poller { p -> p.fixedDelay(10).maxMessagesPerPoll(1) } }
            .channel({ c -> c.queue('fromSupplierQueue') } as Function)
            .get()
}

残念ながら、すべての from() メソッドが Groovy 構造と互換性があるわけではありません。これを解決するために、Spring Integration は IntegrationFlow ファクトリの周囲に Groovy DSL ファクトリを提供します。オーバーロードされた integrationFlow() 関数のセットとして実装されます。GroovyIntegrationFlowDefinition のコンシューマーを使用して、フローの残りを IntegrationFlow クロージャーとして宣言し、上記のエクスペリエンスを再利用し、最終的に get() 呼び出しの必要性を回避します。例:

@Bean
functionFlow() {
    integrationFlow Function<byte[], String>,
            { beanName 'functionGateway' },
            {
                transform {
		            transformer Transformers.objectToString()
                    id 'objectToStringTransformer'
                }
                transform {
		            transformer { it.toUpperCase() }
                    expectedType String
                }
                splitWith {
                    expectedType Message<?>
                    function { it.payload }
                }
                splitWith {
                    expectedType Object
                    id 'splitterEndpoint'
                    function { it }
                }
                resequence()
                aggregate {
                    id 'aggregator'
                    outputProcessor { it.one }
                }
            }
}

@Bean
someFlow() {
    integrationFlow ({ 'test' },
            {
                poller { it.trigger new OnlyOnceTrigger() }
                id 'pollingSource'
            })
            {
                log LoggingHandler.Level.WARN, 'test.category'
                channel { queue 'pollerResultChannel' }
            }
}