30

gRPC では、グローバル例外インターセプターを追加して、RuntimeException意味のある情報をクライアントに伝達する方法を教えてください。

たとえば、メソッドはメッセージとともにdivideスローする場合があります。サーバー側では、次のように記述できます。ArithmeticException/ by zero

@Override
public void divide(DivideRequest request, StreamObserver<DivideResponse> responseObserver) {
  int dom = request.getDenominator();
  int num = request.getNumerator();

  double result = num / dom;
  responseObserver.onNext(DivideResponse.newBuilder().setValue(result).build());
  responseObserver.onCompleted();
}

クライアントが分母 = 0 を渡すと、次のようになります。

Exception in thread "main" io.grpc.StatusRuntimeException: UNKNOWN

そしてサーバー出力

Exception while executing runnable io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$2@62e95ade
java.lang.ArithmeticException: / by zero

クライアントは何が起こっているのかわかりません。

/ by zeroクライアントにメッセージを渡したい場合は、サーバーを次のように変更する必要があります: (この質問で説明されているように)

  try {
    double result = num / dom;
    responseObserver.onNext(DivideResponse.newBuilder().setValue(result).build());
    responseObserver.onCompleted();
  } catch (Exception e) {
    logger.error("onError : {}" , e.getMessage());
    responseObserver.onError(new StatusRuntimeException(Status.INTERNAL.withDescription(e.getMessage())));
  }

クライアントが denominator = 0 を送信すると、次のようになります。

Exception in thread "main" io.grpc.StatusRuntimeException: INTERNAL: / by zero

Good/ by zeroがクライアントに渡されます。

しかし問題は、真のエンタープライズ環境では大量のRuntimeExceptions が存在することです。これらの例外のメッセージを client に渡したい場合は、各メソッドをキャッチする必要があり、これは非常に面倒です。

すべてのメソッドをインターセプトし、キャッチRuntimeExceptionしてトリガーonErrorし、エラーメッセージをクライアントに伝達するグローバルインターセプターはありますか? RuntimeExceptionサーバー コードで s を処理する必要がないようにします。

どうもありがとう !

ノート :

<grpc.version>1.0.1</grpc.version>
com.google.protobuf:proton:3.1.0
io.grpc:protoc-gen-grpc-java:1.0.1
4

9 に答える 9