Каковы отношения с ServerServiceDefinition и конкретным классом? - PullRequest
0 голосов
/ 01 июня 2018

Я учусь использовать grpc недавно и чувствую растерянность после того, как я создал экземпляр класса Server с именем server:

server = ServerBuilder.forPort(port)
            .addService(new MetadataStoreImpl(this.config, port))
            .executor(Executors.newFixedThreadPool(numThreads))
            .build()
            .start();

Я прочитал документацию по Java и обнаружил ServerBuilder.addService:

public abstract T addService(ServerServiceDefinition service);

В этом случае я использую свой собственный класс "MetadataStoreImpl" для замены "ServerServiceDefinition", но до сих пор не знаю, почему.Кроме того, как я могу получить ссылку на переменную-член этого класса MetadataStoreImpl с сервера классов?Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 06 июня 2018

Если ваш MetadataStoreImpl расширяет сгенерированную заглушку службы (например, MetadataStoreImplBase), то он будет реализовывать интерфейс gRPC BindableService.ServerBuilder имеет другой метод addService, который принимает BindableService вместо ServerServiceDefinition. Здесь является примером реализации нашего сгенерированного кода метода bindService, который просто создает и возвращает ServerServiceDefinition.

Для вашего второго вопроса вы можете получить список ServerServiceDefinitions через Server#getServices, но это напрямую не вернет вам ваш исходный MetadataStoreImpl, а скорее ServerServiceDefinition, возвращенный методом bindService сгенерированного кода.Как правило, вы не будете использовать getServices, поскольку вы просто сохраните ссылку на свой сервис после добавления его в конструктор.

Дополнительную информацию о сгенерированном коде Java gRPC можно найти по адресу https://grpc.io/docs/reference/java/generated-code.html.

...