MongoDB、Kotlin、およびSpring WebFluxを使ったリアクティブフロー

1. 概要

このチュートリアルでは、Spring Data Reactive MongoDBとSpring SSeEmitter を使用して完全にリアクティブなフローを紹介する簡単なアプリケーションを作成します。

一方では、Spring Data Reactive MongoDBを適用してMongo Reactiveデータベースを介してデータを保存し、それをServer-Sent-Eventsメカニズムと組み合わせて、受信したデータについて購読しているクライアントに通知します。

さらに、Spring BootのKotlinサポートを利用します。

それでは始めましょう。

2セットアップ

まず最初に、 pom.xml にSpring Data Reactive MongoDB依存関係を追加してMavenプロジェクトを構成する必要があります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>

さらに、Kotlinを使用するには、https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.jetbrains.kotlin%22%20AND%20a%3A%を追加する必要があります22kotlin-stdlib%22同じファイルへの[Kotlin標準ライブラリ]:

<dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-stdlib</artifactId>
</dependency>

これで、アプリケーションを開発する準備が整いました。リアクティブプログラミングとMongo DBをサポートするように環境の設定を始めましょう。

3反応性のあるMongoの設定

最初にしなければならないことは、リアクティブSpringデータをサポートするようにプロジェクトを構成することです。 Mongo ReactiveクライアントとSpring Data Repositoryを設定するために、 AbstractReactiveMongoConfiguration から拡張した新しいクラスを追加します。

@Configuration
@EnableReactiveMongoRepositories(
  basePackageClasses = arrayOf(EventRepository::class))
class MongoConfig : AbstractReactiveMongoConfiguration() {

    override fun getDatabaseName() = "mongoDatabase"

    override fun reactiveMongoClient() = mongoClient()

    @Bean
    fun mongoClient() = MongoClients.create()

    @Bean
    override fun reactiveMongoTemplate()
     = ReactiveMongoTemplate(mongoClient(), databaseName)
}

反応しない方法でMongoDBとやり取りする場合は、この構成は必要ありません。 Spring Dataのリポジトリがどこにあるのかを設定に知らせるために @ EnableReactiveMongoRepositories タグを追加する必要があることに注意してください。

これで、これで主要機能の実装を開始する準備が整いました。私たちが最初にやることは、入ってくる情報を永続化するための新しいデータクラスを開発し、次にその永続性を管理するための関連するSpring Dataのリアクティブリポジトリです。**

4資料

document は、MongoDBデータベースにデータを格納する単位です。本機はJSON形式でデータを保存します。

私たちのプロジェクトでは、 id nameという2つの属性を持つダミーの document called Event __を使ってそれを単純にします

@Document
class Event(id: String, name: String)

5 Spring Data Reactive Repository

Spring Data抽象化の目的は、永続ストア用のデータアクセスレイヤを実装するのに必要なコード量を減らすことです。

その結果、リアクティブバージョンも同じように機能するので、リアクティブリポジトリ全体を実装するには、次の行を使用します。

interface EventRepository : ReactiveMongoRepository<Event, String>

6. コントローラー

Controller クラスは、リアクティブデータが保存されたときはいつでも Server-Sent Event を送信します。

メソッド _saveAndSend はまず、受信データをMongo Reactiveデータベースに保存し、このアクションを EventRepositoryに委任します。 _

そのため、新しい__Eventsを作成して保存する新しいエンドポイントを追加します。

まず、Kotlinのコードを見てみましょう。

@GetMapping(value = "/save",
  produces = arrayOf(MediaType.TEXT__EVENT__STREAM__VALUE))
fun saveAndSend(@RequestParam("eventName") eventName: String) =
  eventRepository
    .save(Event(UUID.randomUUID().toString(), eventName))
    .flux()

ご覧のとおり、新しいデータを保存した後、Spring Dataのリアクティブリポジトリは、サブスクライブしたクライアントに送信されるSSEを返します。

この時点で、私たちは完全なリアクティブKotlinサーバーサイドプロジェクトを持っていると言えます。 Spring Bootアプリケーションを実行するために必要な要素はすべて揃っています。

そこで、作成したすべてのServer-Sentイベントを送受信するための簡単なWebクライアントを作成する方法を見ていきましょう。

7. 加入者

ここに私達はデータを保存しそしてサーバーから変更を受け取ることができるであろう簡単なウェブクライアントを持っています。

実装方法を見てみましょう。

7.1. データを送る

クライアントは __Save new event __ボタンを通してタイプされたイベント名を保存します。

これにより、サーバーエンドポイント saveEvent にHTTP要求が送信されます。

<form method="get" action="/save">
    <input type="text" name="eventName">
    <button type="submit">Save new event</button>
</form>

7.2. データ受信

その一方で、クライアントは __save __endpointも監視します。各プログラミング言語には、SSEを管理するための独自のフレームワークがあります。

ただし、この例では、できるだけ単純にします。

<div id="content"></div>
<script>
    var source = new EventSource("save");

……     source.addEventListener( 'message'、関数(e){         console.log( '新しいメッセージを受信しました');         const index = JSON.parse(e.data);         const content = 新しいイベントが追加されました:$ {index.name} <br> ;         document.getElementById( "content")。innerHTML = content;     }、false)。 </script> ……

8結論

結論として、 Spring Data MongoDBはSpring Framework 5 で導入されたリアクティブプログラミングモデルを利用するように更新されました。このプログラミングパラダイムとServer-Sentイベントを使用する簡単な方法があります。

したがって、これは従来の非反応的なアプリケーションに代わるもので、データベースのブロックに関する問題を想定しています。

この例の実装はhttps://github.com/eugenp/tutorials/tree/master/spring-5-data-reactive[GitHubプロジェクト]で確認できます。

これはMavenベースのプロジェクトなので、Spring Bootアプリケーションを実行してその機能を確認します。 Mongo DBサーバーを最初に実行することを忘れないでください。