如何在gRPC的responseObserver.onError()中传输详细异常消息

时间:2018-10-05 15:13:50

标签: grpc grpc-java

我正在尝试传输详细消息,以描述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中?

1 个答案:

答案 0 :(得分:1)

要发送详细消息,请使用Status将其附加到withDescription

Status.ABORTED.withDescription("The detailed reason")

该描述对于开发人员调试系统很有用。它不是供机器使用的。

Metadata的构造函数是公共的,但是没有参数。您可以使用new Metadata()创建它,然后可以使用put(Key<T> key, T value)之类的东西对其进行修改。元数据对于发送机器可理解的错误详细信息很有用。