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
を開始する必要があります (例: JdbcPollingChannelAdapter
、JmsInboundGateway
または既存の 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' }
}
}