protected void messageReceived( byte[] data, String action, LocalTransport sourceTransport, Version version, @Nullable final Long sendRequestId) { Transports.assertTransportThread(); try { transportServiceAdapter.received(data.length); StreamInput stream = StreamInput.wrap(data); stream.setVersion(version); long requestId = stream.readLong(); byte status = stream.readByte(); boolean isRequest = TransportStatus.isRequest(status); if (isRequest) { ThreadContext threadContext = threadPool.getThreadContext(); threadContext.readHeaders(stream); handleRequest(stream, requestId, data.length, sourceTransport, version); } else { final TransportResponseHandler handler = transportServiceAdapter.onResponseReceived(requestId); // ignore if its null, the adapter logs it if (handler != null) { if (TransportStatus.isError(status)) { handleResponseError(stream, handler); } else { handleResponse(stream, sourceTransport, handler); } } } } catch (Throwable e) { if (sendRequestId != null) { TransportResponseHandler handler = sourceTransport.transportServiceAdapter.onResponseReceived(sendRequestId); if (handler != null) { RemoteTransportException error = new RemoteTransportException(nodeName(), localAddress, action, e); sourceTransport .workers() .execute( () -> { ThreadContext threadContext = sourceTransport.threadPool.getThreadContext(); try (ThreadContext.StoredContext ignore = threadContext.stashContext()) { sourceTransport.handleException(handler, error); } }); } } else { logger.warn("Failed to receive message for action [{}]", e, action); } } }
/** * simulate an error for the given requestId, unlike {@link #handleLocalError(long, Throwable)} * and {@link #handleRemoteError(long, Throwable)}, the provided exception will not be wrapped but * will be delivered to the transport layer as is * * @param requestId the id corresponding to the captured send request * @param e the failure */ public void handleError(final long requestId, final TransportException e) { adapter.onResponseReceived(requestId).handleException(e); }
/** simulate a response for the given requestId */ public void handleResponse(final long requestId, final TransportResponse response) { adapter.onResponseReceived(requestId).handleResponse(response); }