/** * Given an address issues request-and-reply request to a remote address. * * @param request request message to send. * @param responseType type of response. * @param address of remote target service to invoke. * @return mono publisher completing with single response message or with error. */ public Mono<ServiceMessage> requestOne( ServiceMessage request, Class<?> responseType, Address address) { return Mono.defer( () -> { requireNonNull(address, "requestOne address parameter is required and must not be null"); return transport .create(address) .requestResponse(request) .map(message -> ServiceMessageCodec.decodeData(message, responseType)) .map(this::throwIfError); }); }
/** * Given an address issues stream of service requests to service which returns stream of service * messages back. * * @param publisher of service requests. * @param responseType type of responses. * @param address of remote target service to invoke. * @return flux publisher of service responses. */ public Flux<ServiceMessage> requestBidirectional( Publisher<ServiceMessage> publisher, Class<?> responseType, Address address) { return Flux.defer( () -> { requireNonNull( address, "requestBidirectional address parameter is required and must not be null"); return transport .create(address) .requestChannel(publisher) .map(message -> ServiceMessageCodec.decodeData(message, responseType)) .map(this::throwIfError); }); }
/** * Given an address issues request-and-reply request to a remote address. * * @param request request message to send. * @param responseType type of response. * @param address of remote target service to invoke. * @return mono publisher completing with single response message or with error. */ public Mono<ServiceMessage> requestOne( ServiceMessage request, Class<?> responseType, Address address) { return Mono.defer( () -> { requireNonNull(address, "requestOne address parameter is required and must not be null"); return transport .create(address) .requestResponse(request) .map(message -> ServiceMessageCodec.decodeData(message, responseType)) .map(this::throwIfError); }); }
/** * Given an address issues request to remote service which returns stream of service messages * back. * * @param request request with given headers. * @param responseType type of responses. * @param address of remote target service to invoke. * @return flux publisher of service responses. */ public Flux<ServiceMessage> requestMany( ServiceMessage request, Class<?> responseType, Address address) { return Flux.defer( () -> { requireNonNull(address, "requestMany address parameter is required and must not be null"); return transport .create(address) .requestStream(request) .map(message -> ServiceMessageCodec.decodeData(message, responseType)) .map(this::throwIfError); }); }
/** * Given an address issues request to remote service which returns stream of service messages * back. * * @param request request with given headers. * @param responseType type of responses. * @param address of remote target service to invoke. * @return flux publisher of service responses. */ public Flux<ServiceMessage> requestMany( ServiceMessage request, Class<?> responseType, Address address) { return Flux.defer( () -> { requireNonNull(address, "requestMany address parameter is required and must not be null"); return transport .create(address) .requestStream(request) .map(message -> ServiceMessageCodec.decodeData(message, responseType)) .map(this::throwIfError); }); }
/** * Given an address issues stream of service requests to service which returns stream of service * messages back. * * @param publisher of service requests. * @param responseType type of responses. * @param address of remote target service to invoke. * @return flux publisher of service responses. */ public Flux<ServiceMessage> requestBidirectional( Publisher<ServiceMessage> publisher, Class<?> responseType, Address address) { return Flux.defer( () -> { requireNonNull( address, "requestBidirectional address parameter is required and must not be null"); return transport .create(address) .requestChannel(publisher) .map(message -> ServiceMessageCodec.decodeData(message, responseType)) .map(this::throwIfError); }); }
ByteBuf headersBuffer = state.headersBuffer().retain(); ServiceMessage message = ServiceMessageCodec.decodeData( messageCodec.decode(dataBuffer, headersBuffer), dataType); timeContext.stop();