我正在尝试传输详细消息,以描述gRPC的异常。我了解到我应该使用responseObserver.onError进行传输,并且gRPC提供了元数据来执行此操作,但是我仍然不知道将其放置在哪里,因为我无法创建元数据,因此元数据的所有构造方法都不公开的。
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中?
答案 0 :(得分:1)
要发送详细消息,请使用Status
将其附加到withDescription
:
Status.ABORTED.withDescription("The detailed reason")
该描述对于开发人员调试系统很有用。它不是供机器使用的。
Metadata
的构造函数是公共的,但是没有参数。您可以使用new Metadata()
创建它,然后可以使用put(Key<T> key, T value)
之类的东西对其进行修改。元数据对于发送机器可理解的错误详细信息很有用。