Я думаю, что довольно легко реализовать желаемую логику повторов.Что-то вроде:
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, настройки задержки и / или экспоненциального отката и т. Д.