Trong gRPC, làm cách nào để thêm trình chặn chặn ngoại lệ toàn cục chặn bất kỳ RuntimeException
nào và truyền bá thông tin có ý nghĩa cho khách hàng? Ví dụ:Làm cách nào để thêm trình chặn chặn ngoại lệ toàn cầu vào máy chủ gRPC?
ví dụ: phương thức divide
có thể ném ArithmeticException
bằng thông báo / by zero
. Trong phía máy chủ, tôi có thể viết:
@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();
}
Nếu khách hàng qua mẫu số = 0, nó sẽ nhận được:
Exception in thread "main" io.grpc.StatusRuntimeException: UNKNOWN
Và máy chủ kết quả đầu ra
Exception while executing runnable io.grpc.in[email protected]62e95ade
java.lang.ArithmeticException:/by zero
Client doesn' Tôi biết chuyện gì đang xảy ra.
Nếu tôi muốn vượt qua / by zero
thông điệp tới khách hàng, tôi phải thay đổi máy chủ để: (như mô tả trong question này)
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())));
}
Và nếu khách hàng gửi mẫu số = 0, nó sẽ nhận được:
Exception in thread "main" io.grpc.StatusRuntimeException: INTERNAL:/by zero
Tốt, / by zero
được chuyển cho khách hàng. Nhưng vấn đề là, trong một môi trường doanh nghiệp thực sự, sẽ có rất nhiều RuntimeException
s, và nếu tôi muốn truyền các thông điệp ngoại lệ này cho khách hàng, tôi sẽ phải cố gắng nắm bắt từng phương pháp, rất cồng kềnh.
Có máy đánh chặn toàn cầu nào chặn mọi phương thức, bắt RuntimeException
và kích hoạt onError
và truyền bá thông báo lỗi cho khách hàng không? Vì vậy, tôi không phải đối phó với RuntimeException
s trong mã máy chủ của tôi.
Cảm ơn rất nhiều!
Lưu ý:
<grpc.version>1.0.1</grpc.version>
com.google.protobuf:proton:3.1.0
io.grpc:protoc-gen-grpc-java:1.0.1
Xin lỗi, nó không hoạt động. Dòng này 'logger.error (" Ngoại lệ không bắt buộc từ dịch vụ grpc ");' không đạt được! Tôi cũng cảm thấy kỳ lạ. – smallufo
Bạn có muốn chia sẻ mã của mình không? – Gladmir
mã ở đây, FYI: http://pastebin.com/a96suWB1 – smallufo