in src/main/java/com/spotify/futures/ConcurrencyReducer.java [149:177]
private void invoke(final CompletableFuture<T> response,
final Callable<? extends CompletionStage<T>> callable) {
final CompletionStage<T> future;
try {
future = callable.call();
if (future == null) {
limit.release();
response.completeExceptionally(new NullPointerException());
return;
}
} catch (Throwable e) {
limit.release();
response.completeExceptionally(e);
return;
}
future.whenComplete(
(result, t) -> {
if (t != null) {
limit.release();
response.completeExceptionally(t);
pump();
} else {
limit.release();
response.complete(result);
pump();
}
});
}