当前位置: 首页 > 知识库问答 >
问题:

ServerInterceptor gRPC未捕获Quarkus中SmallRye Mutiny反应异常

傅志诚
2023-03-14

我有两个可用的gRPCendpoint和一个ServerInterceptor,它应该在抛出异常时拦截异常。

gRPC服务定义如下:

@GrpcService
public class AccountsResource implements AccountsApiService {

    @Inject
    AccountsService accountsService;

    @Override
    public Uni<GetTppPlatformGroupIdResponse> getTppPlatformGroupId(Empty request) {
        Context.Key<String> tppIamClientIdKey = Constant.TPP_IAM_CLIENT_ID_CONTEXT_KEY;
        String tppIamClientId = tppIamClientIdKey.get(Context.current());

        return Uni.createFrom().item(() -> accountsService.getTppPlatformGroupIdResponse(tppIamClientId))
                .runSubscriptionOn(Infrastructure.getDefaultExecutor());
    }
}

gRPC服务使用SmallRye Mutiny Responsive来处理请求。

其他帖子解释说,应该重写onHalfClose方法,并插入try/catch块来捕获自定义异常,然后映射到StatusRuntimeException gRPC可以使用的状态。我尝试了以下方法:

@ApplicationScoped
@GlobalInterceptor
public class ExceptionInterceptor implements ServerInterceptor {

    private static final Logger LOG = LogManager.getLogger(ExceptionInterceptor.class);

    @Override
    public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> serverCall, Metadata metadata, ServerCallHandler<ReqT, RespT> serverCallHandler) {
        ServerCall.Listener<ReqT> listener = serverCallHandler.startCall(serverCall, metadata);
        return new ExceptionHandlingServerCallListener<>(listener, serverCall, metadata);
    }

    private class ExceptionHandlingServerCallListener<ReqT, RespT> extends ForwardingServerCallListener.SimpleForwardingServerCallListener<ReqT> {
        private ServerCall<ReqT, RespT> serverCall;
        private Metadata metadata;

        ExceptionHandlingServerCallListener(ServerCall.Listener<ReqT> listener, ServerCall<ReqT, RespT> serverCall, Metadata metadata) {
            super(listener);
            this.serverCall = serverCall;
            this.metadata = metadata;
        }

        @Override
        public void onHalfClose() {
            try {
                super.onHalfClose();
            } catch (Throwable ex) {
                handleException(ex, serverCall, metadata);
            }
        }

        @Override
        public void onReady() {
            try {
                super.onReady();
            } catch (Throwable ex) {
                handleException(ex, serverCall, metadata);
            }
        }
    }

handleException方法将Throwable映射到StatusRuntimeException,并抛出StatusRuntimeException。

到目前为止还不错,并且在运行应用程序并模拟自定义异常时,ExceptionInterceptor确实输入了onHalf关闭方法。但是,即使抛出了异常,它也不会进入catch块。此错误消息被记录到控制台:

2022-01-24 12:07:36232警告[io.qua.grp.run.ServerCalls](executor-thread-0)gRPC服务引发了StatusRuntimeException以外的异常

如何修复此问题?


共有1个答案

符风畔
2023-03-14

使用此https://github.com/grpc/grpc-kotlin/issues/141,它位于kotlin中,但可以适应java。

 类似资料:
  • 我正在尝试使用Quarkus构建一个小型REST服务。我正在使用Hibernate和PostgreSQL数据库。它在所有好的情况下都非常有效。但是当出现Hibernate异常时,比如,我无法以正常方式捕获它们。异常被包装为其他异常和。因此,可以通过使用 存储库 资源 由于这个问题,也无法为HibernateException添加一个。是否有人遇到过类似的问题,或者我的代码存在一般性问题?我正在使用

  • 我的用它的作用域启动coroutine 我的只处理一些逻辑,在本例中是某种验证器 然后我的只处理网络层/本地层 以下是我得到的错误日志: 错误直接指向显式的语句。

  • 问题内容: 为什么Java中的某些异常未被捕获?这是代码由于没有处理的异常而完全失败。(Java版本1.4)。 我得到一个 但这有效 我懂了 我以为捕获异常会捕获所有异常?如何捕获Java中的所有异常? 问题答案: 因为某些异常不是源自-例如和。 基本上,类型层次结构是: 只能抛出派生类,因此,如果您抓住,那实际上就可以抓住一切。 ,以及任何异常,从获得 其他 比那些源自数作为 检查的异常 -他们

  • 我对Java线程、Runnable等相当陌生。因此,我想知道为什么下面的代码没有捕获异常? 阅读有没有一种方法可以使Runnable的run()引发异常,我收集到: "...如果您的run()方法确实是Thread的目标,则抛出异常是没有意义的,因为它是不可观察的;抛出异常与不抛出异常(无)具有相同的效果。"(@erickson) 我应该检查Runnable.run()方法中的异常。 为什么会这样

  • 为什么Java中的一些异常不被捕获?这是完全失败的代码,有一个未处理的异常。(Java版本1.4)。 我在线程“main”java中得到了一个 但这行得通 我在java中没有发现任何方法错误。lang.NoSuchMethodError: 我以为捕获异常会捕获所有异常?如何捕获java中的所有异常?

  • 我正在尝试创建一个过滤器来处理异常(请参见在JSF中处理未捕获的异常) 我在日志中看到错误: 我做错了什么?