I have to call an external API method several times a row, until I either run out of attempts, or receive a positive response. In case I run out of attempts, I still want to use (for logging/diagnostics purposes) the latest unsuccesful response. Currently I do it like this:
class SimpleWrapper<T> {
private T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
SimpleWrapper<String> state = new SimpleWrapper<>();
Observable<Response> getLogObservable = Observable.interval(checkInterval, TimeUnit.SECONDS)
.take(checkCount)
.flatMap(ignored -> api.check())
.doOnNext(response -> {
logger.info("Check response: {}", response.getMessage());
state.setData(response.getMessage());
})
.firstOrDefault(null, HubLogsApiResponse::isSuccess)
.flatMap(response -> {
if (response == null) {
return Observable.error(new RuntimeException(String.format("Last call to check was unsuccessful: %s", state.getData())));
} else {
return Observable.just(response);
}
})
This is ugly and requires me to use side-effects, but I don't know how else can this be achieved.
Any suggestions, may be?