如何将多个可绑定服务添加到 grpc 服务器构建器?
How to add multiple Bindable services to a grpc server builder?
我的 gRPC 服务器代码如下:
public void buildServer() {
List<BindableService> theServiceList = new ArrayList<BindableService>();
theServiceList.add(new CreateModuleContentService());
theServiceList.add(new RemoveModuleContentService());
ServerBuilder<?> sb = ServerBuilder.forPort(m_port);
for (BindableService aService : theServiceList) {
sb.addService(aService);
}
m_server = sb.build();
}
客户端代码如下:
public class JavaMainClass {
public static void main(String[] args) {
CreateModuleService createModuleService = new CreateModuleService();
ESDStandardResponse esdReponse = createModuleService.createAtomicBlock("8601934885970354030", "atm1");
RemoveModuleService moduleService = new RemoveModuleService();
moduleService.removeAtomicBlock("8601934885970354030", esdReponse.getId());
}
}
当我是 运行 客户时,我收到如下异常:
Exception in thread "main" io.grpc.StatusRuntimeException: UNIMPLEMENTED: Method grpc.blocks.operations.ModuleContentServices/createAtomicBlock is unimplemented
at io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:233)
at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:214)
at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:139)
在上面的服务器 class 中,如果我评论行 theServiceList.add(new RemoveModuleContentService());
那么 CreateModuleContentService
服务工作正常,也没有评论 RemoveModuleContentService
的所有服务class 正在按预期工作,这意味着问题出在添加另一个服务时的第一个服务。
有人可以建议我如何向 Server Builder 添加两个服务。
特定的 gRPC 服务只能在每个服务器上实现一次。由于错误消息中 gRPC 服务的名称是 ModuleContentServices
,我假设 CreateModuleContentService
和 RemoveModuleContentService
都扩展了 ModuleContentServicesImplBase
.
当您多次添加相同的服务时,以最后一个为准。生成代码的工作方式是注册服务的每个方法,即使您没有实现该特定方法也是如此。每个服务方法默认为一个简单的 returns "UNIMPLEMENTED: Method X is unimplemented" 的处理程序。 createAtomicBlock
未在 RemoveModuleContentService
中实现,因此 returns 该错误。
如果您与 bindService()
返回的 ServerServiceDefinition
交互,您可以混合搭配更多的方法,但这是更高级的 API 并且旨在更多供框架使用,因为单独组合每个应用程序服务会变得冗长。
我的 gRPC 服务器代码如下:
public void buildServer() {
List<BindableService> theServiceList = new ArrayList<BindableService>();
theServiceList.add(new CreateModuleContentService());
theServiceList.add(new RemoveModuleContentService());
ServerBuilder<?> sb = ServerBuilder.forPort(m_port);
for (BindableService aService : theServiceList) {
sb.addService(aService);
}
m_server = sb.build();
}
客户端代码如下:
public class JavaMainClass {
public static void main(String[] args) {
CreateModuleService createModuleService = new CreateModuleService();
ESDStandardResponse esdReponse = createModuleService.createAtomicBlock("8601934885970354030", "atm1");
RemoveModuleService moduleService = new RemoveModuleService();
moduleService.removeAtomicBlock("8601934885970354030", esdReponse.getId());
}
}
当我是 运行 客户时,我收到如下异常:
Exception in thread "main" io.grpc.StatusRuntimeException: UNIMPLEMENTED: Method grpc.blocks.operations.ModuleContentServices/createAtomicBlock is unimplemented
at io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:233)
at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:214)
at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:139)
在上面的服务器 class 中,如果我评论行 theServiceList.add(new RemoveModuleContentService());
那么 CreateModuleContentService
服务工作正常,也没有评论 RemoveModuleContentService
的所有服务class 正在按预期工作,这意味着问题出在添加另一个服务时的第一个服务。
有人可以建议我如何向 Server Builder 添加两个服务。
特定的 gRPC 服务只能在每个服务器上实现一次。由于错误消息中 gRPC 服务的名称是 ModuleContentServices
,我假设 CreateModuleContentService
和 RemoveModuleContentService
都扩展了 ModuleContentServicesImplBase
.
当您多次添加相同的服务时,以最后一个为准。生成代码的工作方式是注册服务的每个方法,即使您没有实现该特定方法也是如此。每个服务方法默认为一个简单的 returns "UNIMPLEMENTED: Method X is unimplemented" 的处理程序。 createAtomicBlock
未在 RemoveModuleContentService
中实现,因此 returns 该错误。
如果您与 bindService()
返回的 ServerServiceDefinition
交互,您可以混合搭配更多的方法,但这是更高级的 API 并且旨在更多供框架使用,因为单独组合每个应用程序服务会变得冗长。