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
がクライアントに渡されます。
しかし問題は、真のエンタープライズ環境では大量のRuntimeException
s が存在することです。これらの例外のメッセージを 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