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