4

次の動作を実装する必要があります。

  • REST 投稿リクエストを作成する
  • 応答が status で返された場合429 Too many requests、1 秒の遅延で最大 3 回再試行します
  • 3 回目の再試行が失敗した場合、またはその他のエラーが発生した場合は、ログに記録してデータベースに何かを書き込みます。
  • リクエストが成功した場合 (http ステータス 200)、いくつかの情報をログに記録します

この目的のために Spring WebClient を使用したいと思い、次のコードを思いつきました。

Mono<ClientResponse> response = webClient.post()
            .uri(URI.create("/myuri"))
            .body(BodyInserters.fromObject(request))
            .retrieve()
            .onStatus(httpStatus -> httpStatus.equals(HttpStatus.TOO_MANY_REQUESTS), 
                      response -> Mono.error(new TooManyRequestsException("System is overloaded")))
            .bodyToMono(ClientResponse.class)
            .retryWhen(Retry.anyOf(TooManyRequestsException.class)
                                          .fixedBackoff(Duration.ofSeconds(1)).retryMax(3))
            .doOnError(throwable -> saveToDB(some_id, throwable))
            .subscribe(response -> logResponse(some_id, response));

ここで、再試行メカニズムとエラー処理が期待どおりに機能するかどうかをテストしたいと思います。この目的でStepVerifierを使用できるかもしれませんが、私の場合はそれを使用する方法がわかりません。役に立つヒントはありますか?

4

2 に答える 2

1

Dominik Sandjaja の回答は、基本的にテストのセットアップに役立ちました。完全を期すために、ここに作業バージョンを投稿します。

@Test
public void mytest() {
    MockResponse mockResponse = new MockResponse()
        .setHeader(HttpHeaders.CONTENT_TYPE, "application/json")
        .setResponseCode(429).setBody("Too many requests");
    mockWebServer.enqueue(mockResponse);
    mockWebServer.enqueue(mockResponse);
    mockWebServer.enqueue(mockResponse);
    mockWebServer.enqueue(mockResponse);

    Mono<MyClass> responseMono = methodDoingTheAsyncCall.sendAsync(...);
    StepVerifier.create(responseMono)
                .expectError(RetryExhaustedException.class)
                .verify();
}
于 2019-10-02T06:50:12.257 に答える