[解決済み] WebClientで例外処理 io.netty.handler.timeout.ReadTimeoutException を投げる
質問
私はリアクティブ・プログラミングの初心者で、テストしたいコードをいくつか書きました。私はファイルをライブでコピーして、それらが同じであるかどうかを後でチェックするので、それらはより統合的なテストです。私は
MockWebServer
をモックにしたものです。
4xx
これは、コード内でうまく処理されています。残念ながら、私は
io.netty.handler.timeout.ReadTimeoutException
これは、私のカスタム
WebClientResponseException
ので、テストでは間違った例外が発生します。基本的には2つの疑問があります。
io.netty.handler.timeout.ReadTimeoutException
例外が発生します。の後にのみ表示されます。
doOnError()
メソッドで、なぜこのようなことが起こっているのかさえ、よくわかりません。
今現在のコードがそうであり、同期的であることは十分承知しています。
2つ目の質問は、与えられた再試行回数の後、テストの中でどのようにカスタム例外を処理できるかということです。今は3回で、その時だけ別の例外をスローするようにしたいのです。
以下はそのコードです。
AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(targetPath, StandardOpenOption.WRITE);
Flux<DataBuffer> fileDataStream = Mono.just(filePath)
.map(file -> targetPath.toFile().exists() ? targetPath.toFile().length() : 0)
.map(bytes -> webClient
.get()
.uri(uri)
.accept(MediaType.APPLICATION_OCTET_STREAM)
.header("Range", String.format("bytes=%d-", bytes))
.retrieve()
.onStatus(HttpStatus::is4xxClientError, clientResponse -> Mono.error(new CustomException("4xx error")))
.onStatus(HttpStatus::is5xxServerError, clientResponse -> Mono.error(new CustomException("5xx error")))
.bodyToFlux(DataBuffer.class)
.doOnError(throwable -> log.info("fileDataStream onError", throwable))
)
.flatMapMany(Function.identity());
return DataBufferUtils
.write(fileDataStream, fileChannel)
.map(DataBufferUtils::release)
.doOnError(throwable -> {
try {
fileChannel.force(true);
} catch (IOException e) {
throw new WritingException("failed force update to file channel", e);
}
})
.retry(3)
.doOnComplete(() -> {
try {
fileChannel.force(true);
} catch (IOException e) {
log.warn("failed force update to file channel", e);
throw new WritingException("failed force update to file channel", e);
}
})
.doOnError(throwable -> targetPath.toFile().delete())
.then(Mono.just(target));
レスポンスは
Mono<Path>
にしか興味がないので
Path
新しく作成されコピーされたファイルの
コードに関するコメントをお待ちしています。
コピー機構は、このスレッドを参考にして作りました。 Project ReactorでExchangeFunctionを使ってClientRequestからファイルをダウンロードし、保存する。
どのように解決するのですか?
つまり、基本的にはテストに問題があったということです。私は
MockResponse
にエンキューされます。
MockWebServer
で再試行すると、一度だけ
WebClient
模擬サーバには何もレスポンスが設定されていませんでした(基本的に模擬レスポンスがないため、全く利用できないような挙動となりました)。
サーバーが完全にダウンした場合の例外処理に対応するために、次のような行をフラックスチェーンに追加する価値があると私は考えています。
.doOnError(ChannelException.class, e -> {
throw new YourCustomExceptionForHandlingServerIsDownSituation("Server is unreachable", e);
})
これを利用すると
ReadTimeoutException
を拡張しているため、Nettyから(サーバーに到達できない場合)。
ChannelException
クラスがあります。例外処理は必ず行ってください。
関連
-
[解決済み】非閉鎖文字リテラルエラー
-
[解決済み】Gradleがtools.jarを見つけ出さない
-
[解決済み】純粋なJUnitテストにVisibleForTestingを使用する方法
-
[解決済み】どういう意味か。Serializableクラスがstatic final serialVersionUIDフィールドを宣言していないとは?重複している] [重複している] [重複している] [重複している
-
[解決済み】 executeQuery()でデータ操作文が発行できない。)
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] HibernateがMultipleBagFetchExceptionをスローする - 複数のバッグを同時にフェッチできない
-
[解決済み] voidメソッドが例外を投げるかどうかをMockitoがテストする
-
[解決済み] C#でWebClientを使用して特定のURLにデータをポストする方法
-
[解決済み】Java 8 Lambda関数が例外を投げる?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】リンクリストの負の値の数でnegativeCntrを代入する
-
[解決済み] hibernateでResultSetを抽出できない。
-
[解決済み】エラー。Selection does not contain a main type
-
[解決済み】Doubleはdereferencedできない?
-
[解決済み] 二項演算子「&」のオペランド型がおかしい java
-
[解決済み】-XX:MaxPermSizeは何をするのですか?
-
[解決済み】Eclipseで「JUnitテストが見つかりませんでした。
-
[解決済み】Javaのswitch文。定数式が必要だが、定数である
-
[解決済み] [Solved] java.lang.NoClassDefFoundError: クラスXXXを初期化できませんでした。
-
[解決済み] テスト