Class ConcurrentRequestObserver<RequestT,​ResponseT>

  • All Implemented Interfaces:
    StreamObserver<RequestT>
    Direct Known Subclasses:
    OrderedConcurrentRequestObserver

    public class ConcurrentRequestObserver<RequestT,​ResponseT>
    extends Object
    implements StreamObserver<RequestT>
    A request StreamObserver for bi-di streaming methods that dispatch work to multiple threads and don't care about the order of responses. Handles all the synchronization and manual flow control to maintain desired number of request messages processed concurrently and prevent excessive buffering.

    Typical usage:

    public StreamObserver<RequestMessage> myBiDiMethod(
            StreamObserver<ResponseMessage> responseObserver) {
        return new ConcurrentRequestObserver<RequestMessage, ResponseMessage>(
            (ServerCallStreamObserver<ResponseMessage>) responseObserver,
            executor.getMaximumPoolSize(),
            (requestMessage, singleRequestMessageResponseObserver) -> {
                executor.execute(() -> {
                    var responseMessage = process(requestMessage);
                    singleRequestMessageResponseObserver.onNext(responseMessage);
                    singleRequestMessageResponseObserver.onCompleted();
                });
            },
            (error) -> log.info(error)
        );
    }
     

    Once response observers for all request messages are closed and the client closes his request stream, responseObserver.onCompleted() is called automatically.