【无标题】java GRPC 远程调用---请求流接口(二)

本文介绍了如何在.proto文件中添加一个使用stream修饰的方法,并在服务端和客户端实现该方法。服务端通过实现StreamObserver接口返回请求流观察者,而客户端进行异步调用,利用StreamObserver进行响应处理。此过程展示了gRPC的流式RPC调用方式。
摘要由CSDN通过智能技术生成

在.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){}

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值