@Override protected void handleRequests() { if (!hasNextPage()) { completeSubscription(); return; } synchronized (this) { if (outstandingRequests.get() <= 0) { stopTask(); return; } } if (!isTerminated()) { outstandingRequests.getAndDecrement(); nextPageFetcher.nextPage(currentPage) .whenComplete(((response, error) -> { if (response != null) { currentPage = response; subscriber.onNext(response); handleRequests(); } if (error != null) { subscriber.onError(error); cleanup(); } })); } }