Сервер Java gRPC не запускается

#java #grpc #grpc-java

#java #grpc #grpc-java

Вопрос:

Я пытаюсь реализовать службу gRPC в своем коде с условием использования одного экземпляра класса server для успешного построения кода, но я получил ошибку во время выполнения.

Как я могу исправить эту ошибку?

 Exception in thread "main" java.lang.NullPointerException: bindableService
   at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:897)
   at io.grpc.internal.AbstractServerImplBuilder.addService(AbstractServerImplBuilder.java:120)
   at io.grpc.internal.AbstractServerImplBuilder.addService(AbstractServerImplBuilder.java:56)
   at com.mypackage.cu.comms.CURequestHandlerService.<init>(Unknown Source)
   at com.mypackage.cu.comms.CURequestHandlerService.start(Unknown Source)
   at com.mypackage.cu.entities.ControlUnit.initSystem(Unknown Source)
   at com.mypackage.cu.entities.ControlUnit.run(Unknown Source)
   at com.mypackage.cu.entities.ControlUnit.main(Unknown Source)
 
  • созданный java-класс grpc называется CURequestHandlerGrpc .
  • класс сервера CURequestHandlerService:
 import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;
\ ..

public class CURequestHandlerService extends CURequestHandlerGrpc.CURequestHandlerImplBase {
  private final Server server;
  private static CURequestHandlerService INSTANCE = null;
  private CURequestHandlerService(int port) {
    this.server = ServerBuilder.forPort(port)
            .addService(INSTANCE)
            .build();
  }

  public static void start(int port) {
    if (INSTANCE == null)
      INSTANCE = new CURequestHandlerService(port);

    try {
      INSTANCE.server.start();
    } catch (IOException e) {
      System.out.println("Can't start GRPC server!");
    }
  }
 
  • в основном классе
 CURequestHandlerService.start(16440);
 

Я использую Ant, поскольку это старый проект, и я его поддерживаю.
Я добавляю все банки зависимостей grpc в каталог зависимостей.

  • мои банки зависимостей:
 amqp-client-5.7.3.jar
failureaccess-1.0.1.jar
grpc-all-1.27.0.jar
grpc-api-1.27.0.jar
grpc-auth-1.27.0.jar
grpc-context-1.27.0.jar
grpc-core-1.27.0.jar
grpc-netty-1.27.0.jar
grpc-netty-shaded-1.27.0.jar
grpc-protobuf-1.27.0.jar
grpc-protobuf-lite-1.27.0.jar
grpc-stub-1.27.0.jar
grpc-testing-1.27.0.jar
guava-28.2-jre.jar
json-smart-1.2.jar
lettuce-4.3.0.Final-shaded.jar
libthrift-0.9.3.jar
opencensus-api-0.20.0.jar
opencensus-contrib-grpc-metrics-0.20.0.jar
perfmark-api-0.21.0.jar
protobuf-java-3.11.3.jar
protobuf-java-util-3.11.3.jar
protoc-gen-grpc-java-1.27.0-linux-x86_64.exe
slf4j-api-1.7.22.jar
slf4j-simple-1.7.22.jar
 

Ответ №1:

Я обнаружил проблему, это не проблема с зависимостями, после прочтения примера сервера в репозитории grpc-java. Я скрыл, что вы должны отделить класс сервера от класса реализации, который распространяется на класс, созданный Grpc.

  • Класс сервера
 /**
 * Grpc instance class that used to initiate the server and call implementation class
 */
public class GrpcServer {
    private final Server server;
    private static GrpcServer INSTANCE = null;
    private GrpcServer(int port) {
        this.server = ServerBuilder.forPort(port)
                .addService(new CURequestHandlerService())
                .build();
    }

    public static void start(int port) {
        if (INSTANCE == null)
            INSTANCE = new GrpcServer(port);

        try {
            INSTANCE.server.start();
            System.out.println("GRPC server started");
        } catch (IOException e) {
            System.out.println("Can't start GRPC server!");
        }
    }
}
 
  • класс реализации
 **
 * Request Handler class contains the implementation for all functions initiated in proto files
 * The implemented function 
 * */
public class CURequestHandlerService extends CURequestHandlerGrpc.CURequestHandlerImplBase{


  public synchronized void Method1(Messages.Method1Input input,
                                         StreamObserver<Messages.Method1Output> output) {
    //...
    output.onNext(outputResponse);
    output.onCompleted();
  }