我正在学习最近使用grpc,并在实例化名为server的Server类后感到困惑:
template<typename U = T,
typename = std::enable_if_t<
!std::is_reference_v<U>
&& std::is_same_v<U, T>>>
void f(T&& x){}
template <typename U = T>
std::enable_if_t<
!std::is_reference_v<U>
&& std::is_same_v<U, T>> f(T&& x)
{ }
我阅读了java doc并找到了ServerBuilder.addService:
server = ServerBuilder.forPort(port)
.addService(new MetadataStoreImpl(this.config, port))
.executor(Executors.newFixedThreadPool(numThreads))
.build()
.start();
在这种情况下,我使用自己的类“MetadataStoreImpl”来替换“ServerServiceDefinition”,但仍然不知道原因。此外,如何从类服务器引用此MetadataStoreImpl类的成员变量? 谁能帮助我?
答案 0 :(得分:1)
如果您的MetadataStoreImpl
扩展了生成的服务存根(例如MetadataStoreImplBase
),那么它将实现gRPC的BindableService
接口。 ServerBuilder
有另一种addService
方法接受BindableService
而不是ServerServiceDefinition
。 Here是我们生成的bindService
方法代码实现的一个示例,它只构建并返回ServerServiceDefinition
。
对于您的第二个问题,您可以通过Server#getServices
获取ServerServiceDefinitions
的列表,但这不会直接让您原来的MetadataStoreImpl
,而是{{} 1}}由生成的代码ServerServiceDefinition
方法返回。通常情况下,您不会使用bindService
,因为您只需在将服务添加到构建器后保留对服务的引用。
您可以在https://grpc.io/docs/reference/java/generated-code.html找到更多信息gRPC Java生成的代码。