Class BidiStreamingCallable<RequestT,​ResponseT>

  • Direct Known Subclasses:
    TracedBidiCallable

    public abstract class BidiStreamingCallable<RequestT,​ResponseT>
    extends Object
    A BidiStreamingCallable is an immutable object which is capable of making RPC calls to bidirectional streaming API methods. Not all transports support streaming.

    It is considered advanced usage for a user to create a BidiStreamingCallable themselves. This class is intended to be created by a generated client class, and configured by instances of StreamingCallSettings.Builder which are exposed through the client settings class.

    • Constructor Detail

      • BidiStreamingCallable

        protected BidiStreamingCallable()
    • Method Detail

      • call

        public void call​(BidiStreamObserver<RequestT,​ResponseT> bidiObserver)
        Listens to server responses and send requests when the network is free. Example usage:
        
         final Iterator<Integer> sourceDataIterator = intCollection.iterator();
         BidiStreamObserver<Integer, String> bidiStreamObserver = new BidiStreamObserver<Integer, String>() {
           public void onStart(StreamController controller) {
             // no-op
           }
        
           public void onResponse(String response) {
             System.out.println(response);
           }
        
           public void onComplete() {
             System.out.println("done!");
           }
        
           public void onError(Throwable t) {
             System.out.println("error: " + t);
           }
        
           public void onReady(ClientStream<Integer> stream) {
             while (sourceDataIterator.hasNext()) {
               if (stream.isReady()) {
                 stream.send(sourceDataIterator.next());
               } else {
                 // It's OK we haven't consumed the whole iterator;
                 // onReady will be called again when the network becomes free.
                 return;
               }
             }
             // We ran out of things to send.
             stream.close();
           }
         };
        
         bidiStreamingCallable.call(bidiStreamObserver);
         
      • call

        public BidiStream<RequestT,​ResponseT> call()
        Send requests and iterate over server responses.

        This returns a live stream that must either be fully consumed or cancelled. Example usage:

        
         BidiStream<String, String> stream = bidiStreamingCallable.call()
         for (String s : stream) {
           if ("needle".equals(s)) {
             // Cancelling the stream will cause `hasNext()` to return false on the next iteration,
             // naturally breaking the loop.
             stream.cancel();
           }
           stream.send(s);
         }
         
      • call

        public BidiStream<RequestT,​ResponseT> call​(ApiCallContext context)
        Send requests and iterate over server responses.

        This returns a live stream that must either be fully consumed or cancelled.

      • splitCall

        public ClientStream<RequestT> splitCall​(ResponseObserver<ResponseT> responseObserver)
        Send requests to the server and listens to responses.

        Example usage:

        
         ResponseObserver<String> responseObserver = new ResponseObserver<String>() {
           public void onStart(StreamController controller) {
             // no-op
           }
        
          public void onResponse(String response) {
            System.out.println(response);
          }
        
          public void onComplete() {
            System.out.println("done!");
          }
        
          public void onError(Throwable t) {
            System.out.println("error: " + t);
          }
         };
        
         ClientStream<Integer> clientStream = bidiStreamingCallable.splitCall(responseObserver);
         clientStream.send(42);
         clientStream.send(43);
         clientStream.close();