/** * Handles a request response. */ @SuppressWarnings("unchecked") private void handleResponseOk(long requestId, Object response) { ContextualFuture future = futures.remove(requestId); if (future != null) { future.context.executor().execute(() -> future.complete(response)); } }
/** * Closes the connection. */ private void doClose() { open = false; connections.remove(this); for (Map.Entry<Long, ContextualFuture> entry : futures.entrySet()) { ContextualFuture future = entry.getValue(); try { future.context.executor().execute(() -> future.completeExceptionally(new IllegalStateException("connection closed"))); } catch (RejectedExecutionException e) { } } futures.clear(); for (Consumer<Connection> closeListener : closeListeners) { try { context.executor().execute(() -> closeListener.accept(this)); } catch (RejectedExecutionException e) { } } }
/** * Sends a request. */ private void sendRequest(Object request, ContextualFuture future) { if (open && connection.open) { long requestId = ++this.requestId; futures.put(requestId, future); connection.handleRequest(requestId, request); } else { future.context.executor().execute(() -> future.completeExceptionally(new IllegalStateException("connection closed"))); } if (request instanceof ReferenceCounted) { ((ReferenceCounted<?>) request).release(); } }
@Override public <T, U> CompletableFuture<U> send(T request) { if (!open || !connection.open) return Futures.exceptionalFuture(new IllegalStateException("connection closed")); Assert.notNull(request, "request"); ContextualFuture<U> future = new ContextualFuture<>(ThreadContext.currentContextOrThrow()); this.context.execute(() -> sendRequest(request, future)); return future; }
/** * Handles a response error. */ private void handleResponseError(long requestId, Throwable error) { ContextualFuture future = futures.remove(requestId); if (future != null) { future.context.execute(() -> future.completeExceptionally(error)); } }