ClientStream<StreamingPullRequest> initClientStream = stub.streamingPullCallable() .splitCall( responseObserver, GrpcCallContext.createDefault().withChannelAffinity(channelAffinity));
client.streamingRecognizeCallable().splitCall(responseObserver);
return splitCall(responseObserver, null);
return splitCall(responseObserver, null);
/** * Conduct a bidirectional streaming call with the given {@link ApiCallContext}. * * @param responseObserver {@link ApiStreamObserver} to observe the streaming responses * @param context {@link ApiCallContext} to provide context information for the RPC call. * @return {@link ApiStreamObserver} which is used for making streaming requests. * @deprecated Please use {@link #splitCall(ResponseObserver, ApiCallContext)} instead. */ @Deprecated public ApiStreamObserver<RequestT> bidiStreamingCall( ApiStreamObserver<ResponseT> responseObserver, ApiCallContext context) { final ClientStream<RequestT> stream = splitCall(new ApiStreamObserverAdapter<>(responseObserver), context); return new ApiStreamObserver<RequestT>() { @Override public void onNext(RequestT request) { stream.send(request); } @Override public void onError(Throwable t) { stream.closeSendWithError(t); } @Override public void onCompleted() { stream.closeSend(); } }; }
/** * Conduct a bidirectional streaming call with the given {@link ApiCallContext}. * * @param responseObserver {@link ApiStreamObserver} to observe the streaming responses * @param context {@link ApiCallContext} to provide context information for the RPC call. * @return {@link ApiStreamObserver} which is used for making streaming requests. * @deprecated Please use {@link #splitCall(ResponseObserver, ApiCallContext)} instead. */ @Deprecated public ApiStreamObserver<RequestT> bidiStreamingCall( ApiStreamObserver<ResponseT> responseObserver, ApiCallContext context) { final ClientStream<RequestT> stream = splitCall(new ApiStreamObserverAdapter<>(responseObserver), context); return new ApiStreamObserver<RequestT>() { @Override public void onNext(RequestT request) { stream.send(request); } @Override public void onError(Throwable t) { stream.closeSendWithError(t); } @Override public void onCompleted() { stream.closeSend(); } }; }
/** * Send requests and iterate over server responses. * * <p>This returns a live stream that must either be fully consumed or cancelled. */ public BidiStream<RequestT, ResponseT> call(ApiCallContext context) { BidiStream<RequestT, ResponseT> stream = new BidiStream<>(); ClientStream<RequestT> clientStream = splitCall(stream.observer(), context); stream.setClientStream(clientStream); return stream; }
/** * Send requests and iterate over server responses. * * <p>This returns a live stream that must either be fully consumed or cancelled. */ public BidiStream<RequestT, ResponseT> call(ApiCallContext context) { BidiStream<RequestT, ResponseT> stream = new BidiStream<>(); ClientStream<RequestT> clientStream = splitCall(stream.observer(), context); stream.setClientStream(clientStream); return stream; }
@Test public void testBidiStreamingServerError() throws Exception { BidiStreamingCallable<Color, Money> streamingCallable = GrpcCallableFactory.createBidiStreamingCallable( GrpcCallSettings.create(METHOD_STREAMING_RECOGNIZE_ERROR), null, clientContext); CountDownLatch latch = new CountDownLatch(1); GrpcDirectServerStreamingCallableTest.MoneyObserver moneyObserver = new GrpcDirectServerStreamingCallableTest.MoneyObserver(true, latch); Color request = Color.newBuilder().setRed(0.5f).build(); ClientStream<Color> stream = streamingCallable.splitCall(moneyObserver); stream.send(request); latch.await(20, TimeUnit.SECONDS); assertThat(moneyObserver.error).isNotNull(); assertThat(moneyObserver.error).isInstanceOf(ApiException.class); assertThat(moneyObserver.error.getCause()).isInstanceOf(StatusRuntimeException.class); assertThat(((StatusRuntimeException) moneyObserver.error.getCause()).getStatus()) .isEqualTo(Status.INVALID_ARGUMENT); assertThat(moneyObserver.response).isNull(); }
@Test public void testBidiStreamingClientError() throws Exception { BidiStreamingCallable<Color, Money> streamingCallable = GrpcCallableFactory.createBidiStreamingCallable( GrpcCallSettings.create(METHOD_STREAMING_RECOGNIZE_ERROR), null, clientContext); CountDownLatch latch = new CountDownLatch(1); GrpcDirectServerStreamingCallableTest.MoneyObserver moneyObserver = new GrpcDirectServerStreamingCallableTest.MoneyObserver(true, latch); Color request = Color.newBuilder().setRed(0.5f).build(); ClientStream<Color> stream = streamingCallable.splitCall(moneyObserver); Throwable clientError = new StatusRuntimeException(Status.CANCELLED); stream.closeSendWithError(clientError); latch.await(20, TimeUnit.SECONDS); assertThat(moneyObserver.error).isNotNull(); assertThat(moneyObserver.error).isInstanceOf(ApiException.class); assertThat(((ApiException) moneyObserver.error).getStatusCode().getCode()) .isEqualTo(Code.CANCELLED); assertThat(moneyObserver.response).isNull(); // As of gRPC 1.8, when the client closes, the server gRPC issues // io.grpc.StatusRuntimeException: CANCELLED: cancelled before receiving half close // to the server application, and our error is not propagated. // We don't check the error received by the server; we can't round-trip it. }
@Test public void testBidiStreaming() throws Exception { BidiStreamingCallable<Color, Money> streamingCallable = GrpcCallableFactory.createBidiStreamingCallable( GrpcCallSettings.create(METHOD_STREAMING_RECOGNIZE), null, clientContext); CountDownLatch latch = new CountDownLatch(1); GrpcDirectServerStreamingCallableTest.MoneyObserver moneyObserver = new GrpcDirectServerStreamingCallableTest.MoneyObserver(true, latch); Color request = Color.newBuilder().setRed(0.5f).build(); ClientStream<Color> stream = streamingCallable.splitCall(moneyObserver); stream.send(request); stream.closeSend(); latch.await(20, TimeUnit.SECONDS); assertThat(moneyObserver.error).isNull(); Money expected = Money.newBuilder().setCurrencyCode("USD").setUnits(127).build(); assertThat(moneyObserver.response).isEqualTo(expected); assertThat(moneyObserver.completed).isTrue(); }
@Test public void bidiStreaming_ResponseObserver() { BidiStreamingStashCallable<Integer, Integer> callIntList = new BidiStreamingStashCallable<>(Arrays.asList(0, 1, 2)); BidiStreamingCallable<Integer, Integer> callable = FakeCallableFactory.createBidiStreamingCallable( callIntList, StreamingCallSettings.<Integer, Integer>newBuilder().build(), clientContext); AccumulatingStreamObserver responseObserver = new AccumulatingStreamObserver(); ClientStream<Integer> stream = callable.splitCall(responseObserver); stream.send(3); stream.send(4); stream.send(5); stream.closeSend(); assertThat(responseObserver.getValues()).containsExactly(0, 1, 2).inOrder(); assertThat(callIntList.getActualRequests()).containsExactly(3, 4, 5).inOrder(); }