2017-06-05 12 views
0

reference guideのエラー処理セクションで、エラー処理オペレータでエラーが処理されても、元のシーケンスが終了することに注意してください。ストリームのエラーが値に置き換えられ、元のシーケンスが続行されるなど、エラーを処理する方法はありますか?元のシーケンスが終了しないようにエラーを処理する方法はありますか?

"エラー処理オペレータについて学ぶ前に、反応シーケンスのエラーはターミナルイベントであることに注意する必要があります。エラー処理オペレータが使用されても、続行するが、むしろonErrorシグナルを新しいシーケンス(フォールバックシグナル)の開始に変換するので、それは上流の終了シーケンスを置き換えます。

ストリームにいくつかの不良要素しかない状況(私のユースケースを含む)が見えます。そのためにストリーム全体を終了したくない場合があります。

たとえば、次のコードでは、n = 2とすると悪いケースを想定しています。ストリームを正常に処理し、ストリームを終了しないといけません。私はここで何か基本的なものを欠いているかもしれない。

Flux.interval(Duration.ofSeconds(2)) 
     .map(n -> {if (n ==2) throw new IllegalArgumentException(); else {return "Successful-n";}}) 
     .onErrorReturn("Errored") 
     .doOnNext(n -> log("Processed " + n)) 
     .blockLast(); 

答えて

1

単にオブザーバブルに再サブスクライブしたい場合は、retry()演算子を使用できます。エラーが検出されると、オブザーバブルに再登録されます。再試行回数をとるパターンや、Throwableに応じて異なる応答を示すパターンがあります。

編集:オブザーバブルは、と定義されています。エラーが発生した場合、終了するにはとなります。したがって、あなたの例では、コンテナにエラーをラップして、その時点でエラーを投げるのではなく、エラーが特定されたときに実行できるようにする必要があります。

+0

ありがとうございます。これは実用的な手段を提供するかもしれませんが、私が求めているのは、新しいシーケンスを購読する必要がない方法です。私はちょっとしたエラーを処理し、元のシーケンスを続行したいだけです。 – Gaurav

関連する問題