Java gRPC 服务器未启动
Java gRPC Server Not Starting
我正在尝试在我的代码中实现 gRPC 服务,条件是使用服务器的一个实例class代码构建成功,但出现运行时错误。
我该如何解决这个错误?
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)
- 生成的 grpc java class 是 CURequestHandlerGrpc。
- 服务器 class 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!");
}
}
- 主要class
CURequestHandlerService.start(16440);
我正在使用 Ant,因为它是一个旧项目并且我正在维护它。
我将所有 grpc 依赖项 jar 添加到依赖项目录。
- 我的依赖包:
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
阅读 grpc-java 存储库中的服务器示例后,我发现问题不是依赖性问题。我暗示你必须将服务器 class 从扩展自 Grpc 生成的 class.
的实现 class 中分离出来
- 服务器class
/**
* 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!");
}
}
}
- 实施class
**
* 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();
}
我正在尝试在我的代码中实现 gRPC 服务,条件是使用服务器的一个实例class代码构建成功,但出现运行时错误。
我该如何解决这个错误?
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)
- 生成的 grpc java class 是 CURequestHandlerGrpc。
- 服务器 class 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!");
}
}
- 主要class
CURequestHandlerService.start(16440);
我正在使用 Ant,因为它是一个旧项目并且我正在维护它。 我将所有 grpc 依赖项 jar 添加到依赖项目录。
- 我的依赖包:
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
阅读 grpc-java 存储库中的服务器示例后,我发现问题不是依赖性问题。我暗示你必须将服务器 class 从扩展自 Grpc 生成的 class.
的实现 class 中分离出来- 服务器class
/**
* 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!");
}
}
}
- 实施class
**
* 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();
}