コルーチン
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 インターフェースを継承する場合にのみ検出されます。 |