Как добавить несколько Bindable сервисов в сборщик серверов grpc? - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть код сервера 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 голосов
/ 19 ноября 2018

Конкретная служба gRPC может быть реализована только один раз для каждого сервера. Поскольку имя службы gRPC в сообщении об ошибке равно ModuleContentServices, я предполагаю, что CreateModuleContentService и RemoveModuleContentService оба расширяются ModuleContentServicesImplBase.

Когда вы добавляете один и тот же сервис несколько раз, побеждает последний. Как работает сгенерированный код, каждый метод службы регистрируется, даже если вы не реализуете этот конкретный метод. Каждый метод службы по умолчанию использует обработчик, который просто возвращает «UNIMPLEMENTED: метод X не реализован». createAtomicBlock не реализован в RemoveModuleContentService, поэтому он возвращает эту ошибку.

Если вы взаимодействуете с ServerServiceDefinition, возвращаемым bindService(), вы можете немного больше смешивать и сопоставлять методы, но это более продвинутый API и предназначен больше для использования фреймворками, потому что он может стать многословным для составьте каждую заявку на услуги индивидуально.

...