首页 文章

如何将多个Bindable服务添加到grpc服务器构建器?

提问于
浏览
0

我有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 回答

  • 1

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

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

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

相关问题