5.8. リアクティブ Spring Boot アプリケーションでのサーバー送信イベントの使用

HTTP リクエストを受け入れ、サーバー送信イベント (SSE) のストリームを返す単純なサービスを作成します。クライアントがサーバーへの接続を確立し、ストリーミングを開始すると、接続は開いたままになります。サーバーは接続を再利用して、新しいイベントをクライアントに継続的にプッシュします。リクエストをキャンセルすると、接続が閉じられてストリームが停止し、クライアントがサーバーの更新フォームの受信を停止させます。

前提条件

手順

  1. vertx-spring-boot-starter-http をプロジェクトの pom.xml ファイルに依存関係として追加します。

    pom.xml

    <project>
    ...
      <dependencies>
      ...
        <dependency>
          <groupId>dev.snowdrop</groupId>
          <artifactId>vertx-spring-boot-starter-http</artifactId>
        </dependency>
      ...
      <dependencies>
    ...
    </project>

  2. アプリケーションのメインクラスを作成します。

    SseExampleApplication.java

    package dev.snowdrop.vertx.sample.sse;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class SseSampleApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SseSampleApplication.class, args);
        }
    }

  3. アプリケーションのサーバー送信イベントコントローラークラスを作成します。この例では、クラスはランダムな整数のストリームを生成し、それらをターミナルアプリケーションに出力します。

    SseController.java

    package dev.snowdrop.vertx.sample.sse;
    
    import java.time.Duration;
    import java.util.Random;
    
    import org.springframework.http.MediaType;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import reactor.core.publisher.Flux;
    
    @RestController
    public class SseController {
    
        @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
        public Flux<Integer> getRandomNumberStream() {
            Random random = new Random();
    
            return Flux.interval(Duration.ofSeconds(1))
                .map(i -> random.nextInt())
                .log();
        }
    }

  4. オプション: アプリケーションをローカルで実行し、テストします。

    1. Maven プロジェクトのルートディレクトリーへ移動します。

      $ cd myApp
    2. アプリケーションをパッケージ化します。

      $ mvn clean package
    3. コマンドラインからアプリケーションを起動します。

      $ java -jar target/vertx-spring-boot-sample-sse.jar
    4. 新しいターミナルウィンドウで、HTTP 要求を localhost に発行します。サーバーから送信されたイベントコントローラーからランダムな整数の連続ストリームの受信を開始します。

      $ curl localhost:8080
      data:-2126721954
      
      data:-573499422
      
      data:1404187823
      
      data:1338766210
      
      data:-666543077
      ...

      Ctrl+C を押して HTTP 要求をキャンセルし、応答のストリームを終了します。

その他のリソース