如何将多个可绑定服务添加到grpc服务器生成器



我有如下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)

在上面的服务器类中,如果我正在注释行theServiceList.add(new RemoveModuleContentService());,那么CreateModuleContentService服务工作正常,也没有注释,RemoveModuleContentService类的所有服务都按预期工作,这意味着当添加另一个服务时,问题出在第一个服务上。

有人能建议我如何向服务器生成器添加两个服务吗。

每个服务器只能实现一次特定的gRPC服务。由于错误消息中gRPC服务的名称是ModuleContentServices,我假设CreateModuleContentServiceRemoveModuleContentService都扩展了ModuleContentServicesImplBase

当您多次添加同一服务时,最后一个将获胜。生成的代码的工作方式是,即使您没有实现特定的方法,服务的每个方法都会被注册。每个服务方法都默认为一个简单返回"UNIMPLEMENTED:method X is UNIMPLEMENTED"的处理程序。createAtomicBlock未在RemoveModuleContentService中实现,因此它返回该错误。

如果您与bindService()返回的ServerServiceDefinition进行交互,您可以更多地混合和匹配方法,但这是一个更高级的API,更适合框架使用,因为单独编写每个应用程序服务可能会变得冗长。

最新更新