From 5ddd7c1e043b60746ca47bc91a46c6920003f5e9 Mon Sep 17 00:00:00 2001 From: kyoungduk Date: Wed, 15 Apr 2020 09:50:51 +0900 Subject: [PATCH] I reported to jira about error handling in grpc component and it was fixed. https://issues.apache.org/jira/browse/CAMEL-14893 I am also using camel 2.25.x version in my project. So I modified the source code in the 2.25.x branch for this issue. --- .../grpc/server/GrpcMethodHandler.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/components/camel-grpc/src/main/java/org/apache/camel/component/grpc/server/GrpcMethodHandler.java b/components/camel-grpc/src/main/java/org/apache/camel/component/grpc/server/GrpcMethodHandler.java index 118c234fc94d3..ebcaeef98c7aa 100644 --- a/components/camel-grpc/src/main/java/org/apache/camel/component/grpc/server/GrpcMethodHandler.java +++ b/components/camel-grpc/src/main/java/org/apache/camel/component/grpc/server/GrpcMethodHandler.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Map; +import io.grpc.Status; import io.grpc.stub.StreamObserver; import javassist.util.proxy.MethodHandler; import org.apache.camel.Exchange; @@ -64,16 +65,25 @@ public Object invoke(Object self, Method thisMethod, Method proceed, Object[] ar } StreamObserver responseObserver = (StreamObserver)args[1]; - Object responseBody = exchange.getIn().getBody(); - if (responseBody instanceof List) { - List responseList = (List)responseBody; - responseList.forEach((responseItem) -> { - responseObserver.onNext(responseItem); - }); + + if (exchange.isFailed()) { + responseObserver.onError(Status.INTERNAL + .withDescription(exchange.getException().getMessage()) + .withCause(exchange.getException()) // This can be attached to the Status locally, but NOT transmitted to the client! + .asRuntimeException()); } else { - responseObserver.onNext(responseBody); + Object responseBody = exchange.getIn().getBody(); + if (responseBody instanceof List) { + List responseList = (List) responseBody; + responseList.forEach((responseItem) -> { + responseObserver.onNext(responseItem); + }); + } else { + responseObserver.onNext(responseBody); + } + responseObserver.onCompleted(); } - responseObserver.onCompleted(); + } else if (args.length == 1 && args[0] instanceof StreamObserver) { // Single incoming parameter is instance of the io.grpc.stub.StreamObserver final StreamObserver responseObserver = (StreamObserver)args[0];