私のアプリケーションは、複数のエンドポイントと春ブーツアプリです。私たちは、Webfluxを使用して、エンドポイントを有効にSSEを追加しようとしています。
使用事例 :
ステップ1:フロントエンドは、POSTエンドポイントにリクエストを送信し、一意のIDを取得します。
ステップ2:フロントエンドがGETエンドポイントを使用して処理結果をフェッチ(SSEが有効 - フラックスを)
角度は、SSEのエンドポイントを消費するのEventSourceオブジェクトを使用しています。これは、テキスト/イベント・ストリームを生成するために、エンドポイントが必要です。これは、正のテストケースのために非常に適しています。ランタイム例外がサービスからスローされた場合でも、角度のフロントエンドはHTTPステータスコードと例外の詳細を取得することはできません。これは、データを持たないだけでエラー。
スローされる例外:
@ResponseStatus(code = HttpStatus.NOT_FOUND)
public class RequestNotFoundException extends RuntimeException {
private static final long serialVersionUID = 1L;
public RequestNotFoundException(String message) {
super(message);
}
}
で述べたように、この、帰国Flux<ServerSentEvent>
してカスタムイベントとフラックスを終了します:
Javaのエンドポイント
@GetMapping(path= "{id}/async", produces=MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<Optional<ProcessedResult>>> getProcessedResultStream(
@PathVariable("id") @ApiParam(value = "The unique identifier of the request", required = true) String id)
throws InterruptedException {
// Combining data and adding a disconnect event to handle at the frontend.
return Flux.concat(
Flux.just(ServerSentEvent.<Optional<ProcessedResult>>builder(service.getProcessedResult(id))
.build()),
Flux.just(ServerSentEvent.<Optional<ProcessedResult>>builder().event("disconnect").build()));
}
これは、それを切断することにより、UI側での接続を閉じることができます。しかし、私の主な問題は開いたまま。どのように私は戻ってフロントエンドにエラーメッセージを伝播して行くべきですか?上に示したように、すべての他の(通常の)エンドポイントは、適切なHTTPコードを使用してカスタムランタイム例外をスローします。
私はまた、例外の詳細を取るために私ProcessedResultクラスを変更する必要がありますか?
サーバー側のイベントはサーバーからのストリームコンテンツへのオープンHTTP接続を使用します。W3C仕様によるとEVENTSOURCE適切なContent-TypeヘッダとHTTP 200 OK応答の接続を確立するために必要な、HTTP 500, 502, 503, 504
または他のネットワークエラーは、ブラウザが接続を再確立するようになります。上記のケースのいずれも満たしていない場合はエラーイベントがトリガされてreadyState = 'CLOSED'
。要するに、onError
コールバックは唯一のネットワークタイムアウトやアクセス制御の問題を処理するためのものです。
あなたが接続を確立するとき、あなたがすでに200 OKを送信するため、実行時例外に基づいて、異なるHTTPステータスコードを送信することはできません。ハンドルランタイムエラーへの唯一の方法は、例外をキャッチし、サーバからカスタムという名前のイベントを送信することであることに基づきます。close
EvetSource