как повторить Spring WebClient, чтобы повторить операцию, основанную на ответе? - PullRequest
0 голосов
/ 20 сентября 2019

Я изучал Spring WebFlux и застрял в этом.

Я сделал запрос на REST API из приложения Spring с помощью WebClient.Я хочу повторить запрос на основе ответа.скажем, если ответ имеет свойство status: 'not-ready', то мне нужно повторить ту же операцию через секунду.

Я пробовал следующий способ, но не уверен, как его реализовать

public Flux<Data> makeHttpRequest(int page) {
        Flux<Data> data = webClient.get()
                .uri("/api/users?page=" + page)
                .retrieve()
                .bodyToFlux(Data.class);
        return data;
}
GET : /api/users returns the folowing response

ex: 1 {
  status: 'ready',
  data: [......]
}

ex: 2 {
  status: 'not-ready',
  data: null
}

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 24 сентября 2019

Я думаю, что довольно легко реализовать желаемую логику повторов.Что-то вроде:

public class SampleRequester {

    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    private WebClient client;

    public SampleRequester() {
        this.client = WebClient.create();
    }

    public void scheduleRequest(int secondsDelay) {
        scheduler.schedule(this::initiateRequest, secondsDelay, SECONDS);
    }

    private void initiateRequest() {
        Mono<ResponseData> response = client.get()
                .uri("example.com")
                .retrieve()
                .bodyToMono(ResponseData.class);

        response.subscribe(this::handleResponse);
    }

    private void handleResponse(ResponseData body) {
        if("ready".equals(body.getStatus())) {
            System.out.println("No Retry");
            // Do something with the data
        } else {
            System.out.println("Retry after 1 second");
            scheduleRequest(1);
        }
    }
}

Я использовал следующую простую модель для ответа:

public class ResponseData implements Serializable {

    private String status;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }
}   

Затем вы бы вызвали SampleRequester.scheduleRequest (0), чтобы немедленно инициировать первый вызов,Конечно, вам также потребуется адаптировать, чтобы избежать жесткого кодирования URL-адреса запроса, расширения ResponseData, настройки задержки и / или экспоненциального отката и т. Д.

...