Я пытаюсь передать подробное сообщение с описанием исключения с помощью 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())));
            }
        }
    }

Как и выше, я не могу создать метаданные с помощью «новых метаданных (« xxxx »)», так как я могу заключить свое специальное сообщение в responseObserver.onError?

1
Long.zhao 5 Окт 2018 в 18:13

1 ответ

Лучший ответ

Чтобы отправить подробное сообщение, прикрепите его к Status с помощью withDescription:

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

Описание полезно разработчикам для отладки системы. Он не предназначен для машинного потребления.

Конструктор для Metadata общедоступен, но не имеет аргументов. Вы создаете его с помощью new Metadata(), а затем можете изменять с помощью таких вещей, как put(Key<T> key, T value). Метаданные полезны для отправки понятных для машины сведений об ошибках.

2
Eric Anderson 10 Окт 2018 в 17:59