Java中的gRPC - 阻塞/非阻塞存根

时间:2017-07-28 10:30:56

标签: java grpc grpc-java

我正在尝试创建一个java grpc客户端来与go中的服务器通信。我是grpc的新手所以遵循这个教程gRPC Java Tutorial。在这些示例中,它们指的是阻塞和非阻塞存根,它们似乎从github中的其他位置导入。

import io.grpc.examples.routeguide.RouteGuideGrpc.RouteGuideBlockingStub;
import io.grpc.examples.routeguide.RouteGuideGrpc.RouteGuideStub;
...
...    
blockingStub = RouteGuideGrpc.newBlockingStub(channel);
asyncStub = RouteGuideGrpc.newStub(channel);

但是我在他们的回购中找不到这些类。如果在编译.proto文件时它们是否已生成,我仍然对它们的用途感到朦胧?任何帮助/指针将不胜感激。感谢。

2 个答案:

答案 0 :(得分:6)

运行protoc编译器并在proto文件中找到服务声明时,会生成grpc存根类。存根类是客户端用于在服务端点上进行rpc调用的API。

这些存根有两种形式:阻塞和异步。

阻塞存根是同步的(阻止当前运行的线程)并确保在其上调用的rpc调用不会返回,直到它返回响应或引发异常。应该注意不要从UI线程调用阻塞存根上的rpc,因为这会导致无响应/ janky UI。

异步存根通过StreamObserver回调对象进行非阻塞rpc调用,其中响应是异步返回的。

有关更多信息,请参阅有关存根here的grpc文档。

答案 1 :(得分:1)

存根类确实是从.proto文件生成的,这应该通过protobuf-gradle-plugin自动生成。您可以使用任何自定义代码在客户端扩展存根类,以将数据发送到服务器。

如果按照说明从Github克隆项目并构建它,这应该都会自动发生。确保按照他们的说法克隆v1.4.0标记,而不是master,否则您可能会遇到问题:

git clone -b v1.4.0 https://github.com/grpc/grpc-java.git