コルーチン
Kotlin コルーチン (英語) は、ノンブロッキングコードを命令的に記述できる中断可能な計算のインスタンスです。言語側では、suspend 関数が非同期操作の抽象化を提供し、ライブラリ側では、kotlinx.coroutines [GitHub] (英語) が async { } (英語) のような関数と Flow (英語) のような型を提供します。
Spring Data モジュールは、次のスコープでコルーチンのサポートを提供します。
依存関係
コルーチンのサポートは、kotlinx-coroutines-core、kotlinx-coroutines-reactive、kotlinx-coroutines-reactor の依存関係がクラスパスにある場合に有効になります。
<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-coroutines-core</artifactId>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-coroutines-reactive</artifactId>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-coroutines-reactor</artifactId>
</dependency> サポートされているバージョン 1.3.0 以上。 |
Reactive はコルーチンにどのように変換されますか?
戻り値の場合、Reactive API から Coroutines API への変換は次のとおりです。
fun handler(): Mono<Void>はsuspend fun handler()になりますfun handler(): Mono<T>は、Monoを空にできるかどうかに応じて、suspend fun handler(): Tまたはsuspend fun handler(): T?になります。(より静的に型付けされるという利点がある)fun handler(): Flux<T>はfun handler(): Flow<T>になります
Flow (英語) は、コルーチンの世界で Flux に相当し、ホットストリームまたはコールドストリーム、有限ストリームまたは無限ストリームに適していますが、主な違いは次のとおりです。
Flowはプッシュベースで、Fluxはプッシュプルハイブリッドですバックプレッシャーは、サスペンド機能を介して実装されます
Flowには単一の中断collectメソッド (英語) のみがあり、オペレーターは拡張機能 (英語) として実装されますコルーチンのおかげでオペレーターは簡単に実装できます [GitHub] (英語)
拡張により、
Flowにカスタム演算子を追加できます収集操作は機能を中断しています
mapオペレーター (英語) は、中断機能パラメーターをとるため、非同期操作をサポートします(flatMapは不要)。
コルーチンと並行してコードを実行する方法など、詳細については、Spring、コルーチン、Kotlin フローで反応する (英語) に関するこのブログ投稿を参照してください。
リポジトリ
コルーチンリポジトリの例を次に示します。
interface CoroutineRepository : CoroutineCrudRepository<User, String> {
suspend fun findOne(id: String): User
fun findByFirstname(firstname: String): Flow<User>
suspend fun findAllByFirstname(id: String): List<User>
} コルーチンリポジトリはリアクティブリポジトリ上に構築されており、Kotlin のコルーチンを介したデータアクセスのノンブロッキング性を公開します。コルーチンリポジトリのメソッドは、クエリメソッドまたはカスタム実装のいずれかによってサポートできます。カスタム実装メソッドを呼び出すと、コルーチンの呼び出しが実際の実装メソッドに伝播されます。カスタムメソッドが suspend -able の場合、実装メソッドが Mono や Flux などのリアクティブ型を返す必要はありません。
メソッド宣言に応じて、コルーチンコンテキストが使用できる場合とできない場合があることに注意してください。コンテキストへのアクセスを保持するには、suspend を使用してメソッドを宣言するか、Flow などのコンテキスト伝播を有効にする型を返します。
suspend fun findOne(id: String): User: 一時停止して、データを 1 回だけ同期的に取得します。fun findByFirstname(firstname: String): Flow<User>: データのストリームを取得します。Flowは、Flowの相互作用(Flow.collect(…))でデータがフェッチされている間、先行して作成されます。fun getUser(): User: スレッドをブロックした後、コンテキスト伝播なしでデータを取得します。これは避けるべきです。
コルーチンリポジトリは、リポジトリが CoroutineCrudRepository インターフェースを継承する場合にのみ検出されます。 |