在.proto文件中新加一个方法,这个方法的参数被 stream 关键字修饰
1 | rpc methodRequestStream(stream Request) returns (Result) {} |
然后用maven,清理一下缓存,重新编译一下
2.1.服务端
重新编译之后,实现刚刚新加的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | @Override public StreamObserver<Request> methodRequestStream(StreamObserver<Result> responseObserver) { return new StreamObserver<Request>() { @Override public void onNext(Request request) { System.out.print( "收到了请求 \n" ); } @Override public void onError(Throwable throwable) { } @Override public void onCompleted() { Result result = Result.newBuilder().setResult1( "result1" ).setResult2( "result2" ).build(); responseObserver.onNext(result); responseObserver.onCompleted(); } }; } |
(友情提示,如果 StreamObserver 的的泛型是Result 我们就叫 返回流观察者,如果是 Request 就叫请求流观察者,这样好描述一些)
这个和普通的有点不一样,直接返回了一个 请求流观察者 的接口实现,而且方法的参数还是一个 返回流观察者 ,好像搞反了一样,至于为什么,一会在客户端那里 统一说
2.2.客户端
请求流式异步调用,普通的是同步调用,我们在普通的方法里创建的实例 也是同步的,所以我们要在 JavaGrpcClient 中新加一个 异步调用的方法,添加一个异步的实例
1 2 3 4 5 6 7 | public <Result> Result runAsync(Functional<TestServiceGrpc.TestServiceStub,Result> functional) { TestServiceGrpc.TestServiceStub testServiceStub = TestServiceGrpc.newStub(channel); return functional.run(testServiceStub); } |
TestServiceGrpc.newStub 返回的是一个异步的实例
再加一个测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | @Test public void contextLoads2() { Request request = Request.newBuilder().setRequest1( "test1" ).setRequest2( "test2" ).build(); StreamObserver<Result> responseObserver = new StreamObserver<Result>() { @Override public void onNext(Result result) { System.out.print( "返回了结果 \n" ); } @Override public void onError(Throwable throwable) { } @Override public void onCompleted() { } }; StreamObserver<Request> result = javaGrpcClient.runAsync(o -> o.methodRequestStream(responseObserver)); result.onNext(request); result.onNext(request); result.onNext(request); result.onCompleted(); try { Thread.sleep( 600000 ); } catch (Exception ex){} } |