Kotlin DSL
Kotlin DSL は、Java DSL のラッパーおよび拡張機能であり、Kotlin での Spring Integration 開発を、既存の Java API および Kotlin 言語固有の構造との相互運用性を備えた、可能な限りスムーズかつ簡単にすることを目的としています。
始めるために必要なのは、org.springframework.integration.dsl.integrationFlow
のインポートだけです。Kotlin DSL のオーバーロードされたグローバル関数です。
ラムダとしての IntegrationFlow
定義の場合、通常は Kotlin から他に何も必要とせず、次のように Bean を宣言します。
@Bean
fun oddFlow() =
IntegrationFlow { flow ->
flow.handle<Any> { _, _ -> "odd" }
}
この場合、Kotlin はラムダを IntegrationFlow
匿名インスタンスに変換する必要があることを理解し、ターゲット Java DSL プロセッサーがこの構造を Java オブジェクトに適切に解析します。
上記の構成の代替として、および以下で説明するユースケースとの一貫性を保つために、ビルダーパターンスタイルで統合フローを宣言するには、Kotlin 固有の DSL を使用する必要があります。
@Bean
fun flowLambda() =
integrationFlow {
filter<String> { it === "test" }
wireTap {
handle { println(it.payload) }
}
transform<String, String> { it.toUpperCase() }
}
このようなグローバル integrationFlow()
関数は、KotlinIntegrationFlowDefinition
(IntegrationFlowDefinition
の Kotlin ラッパー)のビルダースタイルのラムダを期待し、通常の IntegrationFlow
ラムダ実装を生成します。以下のオーバーロードされた integrationFlow()
バリアントをさらに参照してください。
他の多くのシナリオでは、データのソースから IntegrationFlow
を開始する必要があります(例: JdbcPollingChannelAdapter
、JmsInboundGateway
、既存の MessageChannel
のみ)。この目的のために、Spring Integration Java DSL は、IntegrationFlows
ファクトリに多数のオーバーロードされた from()
メソッドを提供します。このファクトリは Kotlin でも使用できます。
@Bean
fun flowFromSupplier() =
IntegrationFlows.from<String>({ "bar" }) { e -> e.poller { p -> p.fixedDelay(10).maxMessagesPerPoll(1) } }
.channel { c -> c.queue("fromSupplierQueue") }
.get()
ただし、残念ながら、すべての from()
メソッドが Kotlin 構造と互換性があるわけではありません。ギャップを修正するために、このプロジェクトは IntegrationFlows
ファクトリの周囲に Kotlin DSL を提供します。これは、オーバーロードされた integrationFlow()
関数のセットとして実装されます。KotlinIntegrationFlowDefinition
のコンシューマーが残りのフローを IntegrationFlow
ラムダとして宣言し、前述のエクスペリエンスを再利用し、最後に get()
呼び出しを回避します。例:
@Bean
fun functionFlow() =
integrationFlow<Function<String, String>>({ beanName("functionGateway") }) {
transform<String, String> { it.toUpperCase() }
}
@Bean
fun messageSourceFlow() =
integrationFlow(MessageProcessorMessageSource { "testSource" },
{ poller { it.fixedDelay(10).maxMessagesPerPoll(1) } }) {
channel { queue("fromSupplierQueue") }
}
さらに、Kotlin 構造にいくらかの改善が必要な Java DSL API に Kotlin 拡張が提供されています。たとえば、IntegrationFlowDefinition<*>
は、Class<P>
引数を持つ多くのメソッドを具体化する必要があります。
@Bean
fun convertFlow() =
integrationFlow("convertFlowInput") {
convert<TestPojo>()
}