2017-11-23 25 views
1

Spring WebFluxでエラー処理を実装する方法に関する良い例を見つけるのに苦労しています。Spring WebFlux Broken Streamエラー処理

処理したいユースケースは、ストリームが予期せず終了したことをHTTPクライアントに通知することです。私が何を発見したのは、ストリーム処理が終了したとき、例えばx項目が処理された後にRuntimeExceptionを発生させるなどの処理が、あまりにも上手く処理されるということです。例外が発生して接続が閉じられるまで、クライアントはすべての項目をフラッシュします。クライアントが関心を持つ限り、要求は成功しました。次のコードは、これが設定されている方法を示しています。

public Mono<ServerResponse> getItems(ServerRequest request) { 

     Counter counter = new Counter(0); 

     return ServerResponse 
       .ok() 
       .contentType(MediaType.APPLICATION_STREAM_JSON) 
       .body(operations.find(query, Document.class, "myCollection") 
         .map(it -> { 
          counter.increment(); 
          if(counter.getCount() > 500) { 
           throw new RuntimeException("an error has occurred"); 
          } 
          return it; 
         }), Document.class); 

} 

エラーを処理し、ストリームが予期せず終了したことをHTTPクライアントに通知する推奨方法は何ですか?

答えて

1

実際にどのように失敗をクライアントに伝えたいかによって異なります。クライアントは特定のエラーメッセージを表示する必要がありますか?クライアントは自動的に再接続する必要がありますか?

ストリームに書き込むことを妨げない "ビジネスエラー"の場合は、特定のイベントタイプ(Server Sent Events仕様を参照)を使用してその失敗を通知できます。

Spring WebFluxは、ServerSentEvent<T>をサポートしています。イベント、ID、コメント、データ(実際のデータ)などのさまざまなフィールドを制御できます。 Flux::onErrorMap演算子を使用すると、特定のServerSentEventを書き込んで、"error"イベントタイプ(詳細はServerSentEvent.builder()をご覧ください)を書くことができます。

しかし、これはクライアントには透過的ではありません。特定のイベントに登録してJavaScriptコードを変更する必要があります。そうしないと、エラーメッセージが通常のメッセージとして表示されることがあります。

+0

返信が遅れるのをお詫び申し上げます。バックエンドのmongoサーバー接続がダウンした場合、エラーが発生したことをクライアントに通知し、構成されたとおりに再試行できるようにしたいとします。非反応性システムでは、これは500ステータスコードと通信されている可能性があります。このシナリオでサーバー送信イベントをもう一度お勧めしますか?エラーイベントがポンピングされる前にエラーがストリームを閉じることはありませんか? – Ellis

+0

要件をさらに説明した後、提案されている解決策の1つは、後続のHTTPヘッダーを使用して成功または失敗を通知することです。ストリームの完了時またはエラー時にWebFluxでこれらを設定するメカニズムはありますか? – Ellis

+0

現在、Spring WebFluxでは末尾のヘッダはサポートされていません。私はそれらが最初にSSEと互換性があるかどうかわかりません。 –

関連する問題