【问题标题】:how to retry Spring WebClient to retry the operation based on the response?如何重试 Spring WebClient 以根据响应重试操作?
【发布时间】:2020-01-21 03:14:56
【问题描述】:

我一直在学习 spring webflux 并陷入了这个困境。

我已使用 WebClient 从 Spring 应用程序向 REST API 发出请求。我想根据响应重试请求。假设响应具有属性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
}

任何帮助将不胜感激。

【问题讨论】:

标签: java spring netty spring-webflux project-reactor


【解决方案1】:

我认为实现所需的重试逻辑相当容易。 大致如下:

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、使延迟可配置和/或指数退避等。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-04-20
  • 2020-01-17
  • 1970-01-01
  • 2016-10-03
  • 2021-01-28
  • 1970-01-01
  • 2020-07-17
  • 2021-11-03
相关资源
最近更新 更多