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> { it.toUpperCase() }
}
このようなグローバル integrationFlow()
関数は、KotlinIntegrationFlowDefinition
(IntegrationFlowDefinition
の Kotlin ラッパー)のビルダースタイルのラムダを期待し、通常の IntegrationFlow
ラムダ実装を生成します。以下のオーバーロードされた integrationFlow()
バリアントをさらに参照してください。
他の多くのシナリオでは、データのソースから IntegrationFlow
を開始する必要があります (例: JdbcPollingChannelAdapter
、JmsInboundGateway
または既存の MessageChannel
)。この目的のために、Spring Integration Java DSL は、多数のオーバーロードされた from()
メソッドを備えた IntegrationFlow
流れるような API を提供します。この API は Kotlin でも使用できます。
@Bean
fun flowFromSupplier() =
IntegrationFlow.fromSupplier({ "bar" }) { e -> e.poller { p -> p.fixedDelay(10).maxMessagesPerPoll(1) } }
.channel { c -> c.queue("fromSupplierQueue") }
.get()
残念ながら、すべての from()
メソッドが Kotlin 構造と互換性があるわけではありません。このギャップを修正するために、このプロジェクトは IntegrationFlow
流れるような API に関する Kotlin DSL を提供します。オーバーロードされた integrationFlow()
関数のセットとして実装されます。KotlinIntegrationFlowDefinition
のコンシューマーを使用して、残りのフローを IntegrationFlow
ラムダとして宣言し、上記のエクスペリエンスを再利用し、最終的に get()
呼び出しを回避します。例:
@Bean
fun functionFlow() =
integrationFlow<Function<String, String>>({ beanName("functionGateway") }) {
transform<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>()
}
演算子のラムダでもヘッダーにアクセスする必要がある場合は、修正された型を Message<*> 全体にすることができます。 |