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 を開始する必要があります(例: JdbcPollingChannelAdapterJmsInboundGateway、既存の 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>()
    }