1.概要

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

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

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

それでは、始めましょう!

2. 設定

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

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

さらに、Kotlinを使用するには、Kotlin標準ライブラリを同じファイルに追加する必要があります。

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

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

3. リアクティブMongo構成

最初に行う必要があるのは、リアクティブなSpringDataをサポートするようにプロジェクトを構成することです。 AbstractReactiveMongoConfiguration から拡張する新しいクラスを追加して、MongoリアクティブクライアントとSpringデータリポジトリを構成します。

@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と対話する場合は、この構成は必要ありません。 @EnableReactiveMongoRepositories タグを追加して、SpringDataリポジトリがどこにあるかを構成に通知する必要があることに注意してください。

これで、主な機能の実装を開始する準備が整いました。 最初に行うことは、受信情報を永続化するための新しいデータクラスを開発し、次に、その永続化を管理するための関連するSpringDataリアクティブリポジトリを開発することです。

4. 書類

document は、MongoDBデータベースにデータを保存する単位です。 このユニットは、データの保存にJSONスタイルを使用します。

このプロジェクトでは、 idname:の2つの属性を持つイベントと呼ばれるダミーのドキュメントを使用してシンプルに保ちます。

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

5. SpringDataReactiveリポジトリ 

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

したがって、リアクティブバージョンは同じように機能するため、リアクティブリポジトリ全体を実装するための次の行があります。

interface EventRepository : ReactiveMongoRepository<Event, String>

6. コントローラ 

Controller クラスは、リアクティブデータが保存されるたびに、サーバー送信イベントを送信する責任があります。

方法 saveAndSend まず、受信データをMongo Reactiveデータベースに保存し、このアクションを EventRepository。 

したがって、新しいエンドポイントを作成して保存する新しいエンドポイントを追加しますイベント。

まず、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()

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

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

したがって、ここでは、作成したすべてのサーバー送信イベントを送受信するための単純なWebクライアントを作成する方法を見ていきます。

7. サブスクライバー

ここに、データを保存してサーバーから変更を受け取ることができる単純なWebクライアントがあります。

それがどのように実装されているか見てみましょう:

7.1. データを送る

クライアントは、新しいイベントの保存ボタンを使用して、入力したイベント名を保存します。

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

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

7.2. データを受信する

一方、クライアントは保存エンドポイントもリッスンします。 各プログラミング言語には、SSEを管理するための特定のフレームワークがあることに注意してください。

ただし、この例では、可能な限り単純にします。

<div id="content"></div>
<script>
    var source = new EventSource("save");
source.addEventListener('message', function (e) {
        console.log('New message is received');
        const index = JSON.parse(e.data);
        const content = `New event added: ${index.name}<br>`;
        document.getElementById("content").innerHTML += content;
    }, false);
</script>

8. 結論

結論として、 Spring Data MongoDBは、Spring Framework5で導入されたリアクティブプログラミングモデルを活用するように更新されました。 これで、このプログラミングパラダイムとサーバー送信イベントを簡単に使用できるようになりました。

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

この例の実装は、GitHubプロジェクトを確認できます。

これはMavenベースのプロジェクトであるため、SpringBootアプリケーションを実行してどのように機能するかを確認します。 最初にMongoDBサーバーを実行することを忘れないでください。