如何将多个可绑定服务添加到grpc服务器构建器?

时间:2018-11-19 12:43:26

标签: grpc grpc-java

我的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类的所有服务均按预期进行的情况下,这意味着问题出在添加另一个服务时。

有人可以建议我如何向Server Builder添加两个服务。

1 个答案:

答案 0 :(得分:1)

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

当您多次添加相同的服务时,最后一个将获胜。生成的代码的工作方式是,服务的每个方法都会注册,即使您未实现该特定方法也是如此。每个服务方法默认都使用一个仅返回“ UNIMPLEMENTED:方法X未实现”的处理程序。 createAtomicBlock未实现RemoveModuleContentService,因此它返回该错误。

如果您与ServerServiceDefinition返回的bindService()进行交互,则可以使用更多的混合匹配方法,但这是一个更高级的API,并且更适合框架使用,因为它会变得很冗长,无法分别组成每个应用程序服务。