@Override public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> serverCall, Metadata metadata, ServerCallHandler<ReqT, RespT> serverCallHandler) { AsyncListener<ReqT> asyncListener = new AsyncListener<>(); vertx.<ServerCall.Listener<ReqT>>executeBlocking(blockingCode -> blockingCode.complete(interceptor.interceptCall(serverCall, metadata, serverCallHandler)), false, ar -> { if (ar.succeeded()) { asyncListener.setDelegate(ar.result()); } else { Metadata md = Status.trailersFromThrowable(ar.cause()); if (md == null) { md = new Metadata(); } serverCall.close(Status.fromThrowable(ar.cause()), md); } }); return asyncListener; }
@Override public void onComplete() { runIfPresent(ServerCall.Listener::onComplete); }
@Override public void onHalfClose() { runIfPresent(ServerCall.Listener::onHalfClose); }
@Override public void onCancel() { runIfPresent(ServerCall.Listener::onCancel); }
@Override public void onMessage(ReqT message) { runIfPresent(t -> t.onMessage(message)); }
@Override public void onReady() { runIfPresent(ServerCall.Listener::onReady); } }