0

最初のサービスが利用できない場合に、プログラムが動作するときにフォールバックを設定したいと考えています。

2 番目のサービスでは、最初のサービスにアクセスしてそこからデータを受け取るWebClientを使用します。

2 つのオプションを作成しましたが、うまくいきません。

両方のサービスが稼働している場合、すべてが正常に機能します。最初のサービスが利用できない場合、 WebClient 経由でリクエストを送信しようとしても何も起こらず、ブラウザーに空白の画面が表示されます。

1) 最初のオプション:

@Service
public class WebClientService {

    private static final String API_MIME_TYPE = "application/json";
    private static final String API_BASE_URL = "http://localhost:8081";
    private static final String USER_AGENT = "User Service";
    private static final Logger logger = LoggerFactory.getLogger(WebClientService.class);

    private WebClient webClient;

    public WebClientService() {
        this.webClient = WebClient.builder()
                .baseUrl(API_BASE_URL)
                .defaultHeader(HttpHeaders.CONTENT_TYPE, API_MIME_TYPE)
                .defaultHeader(HttpHeaders.USER_AGENT, USER_AGENT)
                .filter(WebClientService.errorHandlingFilter()) 
                .build();
    }


     public Flux<Bucket> getDataByWebClient() {
        return webClient
                .get()
                .uri("/getAll")
                .exchange()
                .flatMapMany(clientResponse -> clientResponse.bodyToFlux(Bucket.class));
    }

    public static ExchangeFilterFunction errorHandlingFilter() {
        return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> {
            if(clientResponse.statusCode()!=null && (clientResponse.statusCode().is5xxServerError() || clientResponse.statusCode().is4xxClientError()) ) {
                return clientResponse.bodyToMono(String.class)
                        .flatMap(errorBody -> {
                            return Mono.error(new MyCustomServerException());
                        });
            }else {
                return Mono.just(clientResponse);
            }
        });
    }

}

クラスMyCustomServerException

public class MyCustomServerException extends Throwable {

    public String getAllEmployeesList() {
        return "Server error";
    }

    public MyCustomServerException() {
        getAllEmployeesList();
    }

}

2) 2 番目のオプション:

@Service
public class WebClientService {

    private static final String API_MIME_TYPE = "application/json";
    private static final String API_BASE_URL = "http://localhost:8081";
    private static final String USER_AGENT = "User Service";
    private static final Logger logger = LoggerFactory.getLogger(WebClientService.class);

    private WebClient webClient;

    public WebClientService() {
        this.webClient = WebClient.builder()
                .baseUrl(API_BASE_URL)
                .defaultHeader(HttpHeaders.CONTENT_TYPE, API_MIME_TYPE)
                .defaultHeader(HttpHeaders.USER_AGENT, USER_AGENT)
                .build();
    }

    public Flux<Bucket> getDataByWebClient() {
        return webClient
                .get()
                .uri("/stream/buckets/delay")
                .exchange()
                .flatMapMany(clientResponse -> clientResponse.bodyToFlux(Bucket.class));
    }


    public Flux<Bucket> getDataByWebClient() {
        return webClient
                .get()
                .uri("/getAll")
                .retrieve()
                .onStatus(HttpStatus::is4xxClientError, response -> {
                    System.out.println("4xx eror");
                    return Mono.error(new RuntimeException("4xx"));
                })
                .onStatus(HttpStatus::is5xxServerError, response -> {
                    System.out.println("5xx eror");
                    return Mono.error(new RuntimeException("5xx"));
                })

                .onStatus(HttpStatus::isError, clientResponse -> {
                    System.out.println("eror");
                    return Mono.error(new MyCustomServerException());
                })
                .bodyToFlux(Bucket.class);
    }

}

なぜこれが機能しないのですか?誰でも教えてもらえますか?

ブラウザーに、エラーのあるクラスからのメッセージ「サーバーエラー」が表示されるようにします。

ありがとう!

4

0 に答える 0