我正在学习最近使用grpc,并且在实例化名为server的Server类后对一件事感到困惑:
server = ServerBuilder.forPort(port)
.addService(new MetadataStoreImpl(this.config, port))
.executor(Executors.newFixedThreadPool(numThreads))
.build()
.start();
我阅读了Java文档,发现了ServerBuilder.addService:
public abstract T addService(ServerServiceDefinition service);
在这种情况下,我使用自己的类“ MetadataStoreImpl”来替换“ ServerServiceDefinition”,但仍然不知道为什么。此外,如何从类服务器获取此MetadataStoreImpl类的成员变量的引用?
有人可以帮我吗?
最佳答案
如果您的MetadataStoreImpl
扩展了生成的服务存根(例如MetadataStoreImplBase
),则它将实现gRPC的BindableService
接口。 ServerBuilder
具有另一个addService
方法,该方法接受BindableService
而不是ServerServiceDefinition
。 Here是我们生成的代码的bindService
方法实现的示例,该方法仅生成并返回ServerServiceDefinition
。
对于第二个问题,您可以通过ServerServiceDefinitions
获取Server#getServices
的列表,但这不会直接给您原来的MetadataStoreImpl
,而是由生成的代码的ServerServiceDefinition
方法返回的bindService
。通常,您不会使用getServices
,因为在将服务添加到构建器之后,您只会保留对服务的引用。
您可以在https://grpc.io/docs/reference/java/generated-code.html中找到gRPC Java生成的代码的更多信息。