如何在 gRPC 的 responseObserver.onError() 中传输详细异常消息
How can I transfer a detail exception message within gRPC's responseObserver.onError()
我正在尝试传输描述 gRPC 异常的详细消息。我知道我应该使用 responseObserver.onError 来传输它,gRPC 提供元数据来做它,但我仍然不知道把它放在哪里,因为我无法创建元数据,元数据的所有构造函数不是 public.
static class GrpcTestService extends GrpcTestGrpc.GrpcTestImplBase {
@Override
public void sayHello(HelloRequest req, StreamObserver<HelloResponse> responseObserver) {
try {
HelloResponse reply = HelloResponse.newBuilder().setMessage("got it ! " + req.getName()).build();
throw new RuntimeException("I'm an exception!!!");
// responseObserver.onNext(reply);
// responseObserver.onCompleted();
} catch (Exception e) {
responseObserver.onError(new StatusRuntimeException(Status.ABORTED, new Metadata("metadata exception".getBytes())));
}
}
}
如上所述,我无法通过 'new Metadata("xxxx")' 创建元数据,所以如何将我的特殊消息包装在 responseObserver.onError 中?
要发送详细消息,请将其附加到带有 withDescription
的 Status
:
Status.ABORTED.withDescription("The detailed reason")
该描述有助于开发者调试系统。它不适用于机器消耗。
Metadata
的构造函数是 public,但没有参数。您可以使用 new Metadata()
创建它,然后可以使用 put(Key<T> key, T value)
之类的内容对其进行修改。元数据对于发送机器可理解的错误详细信息很有用。
我正在尝试传输描述 gRPC 异常的详细消息。我知道我应该使用 responseObserver.onError 来传输它,gRPC 提供元数据来做它,但我仍然不知道把它放在哪里,因为我无法创建元数据,元数据的所有构造函数不是 public.
static class GrpcTestService extends GrpcTestGrpc.GrpcTestImplBase {
@Override
public void sayHello(HelloRequest req, StreamObserver<HelloResponse> responseObserver) {
try {
HelloResponse reply = HelloResponse.newBuilder().setMessage("got it ! " + req.getName()).build();
throw new RuntimeException("I'm an exception!!!");
// responseObserver.onNext(reply);
// responseObserver.onCompleted();
} catch (Exception e) {
responseObserver.onError(new StatusRuntimeException(Status.ABORTED, new Metadata("metadata exception".getBytes())));
}
}
}
如上所述,我无法通过 'new Metadata("xxxx")' 创建元数据,所以如何将我的特殊消息包装在 responseObserver.onError 中?
要发送详细消息,请将其附加到带有 withDescription
的 Status
:
Status.ABORTED.withDescription("The detailed reason")
该描述有助于开发者调试系统。它不适用于机器消耗。
Metadata
的构造函数是 public,但没有参数。您可以使用 new Metadata()
创建它,然后可以使用 put(Key<T> key, T value)
之类的内容对其进行修改。元数据对于发送机器可理解的错误详细信息很有用。