java Quarkus gRPC ExceptionHandlerProvider未关闭状态正确的响应消息

u3r8eeie  于 2023-02-14  发布在  Java
关注(0)|答案(1)|浏览(144)

我有一个Quarkus gRPC服务器(与MutinyReact),如果在服务器端服务抛出异常,我想自定义响应状态。
Repo to reproduce
默认情况下,当抛出异常时,服务器响应gRPC状态UNKNOWN,当抛出异常时,我希望响应状态INTERNAL(或其他)。
为此,我使用了ExceptionHandlerProvider(doc),问题是ExceptionHandler::handleException方法从未被调用(但ExceptionHandlerProvider::transform被调用了)。

  • 代码简化,真实的代码here*
@ApplicationScoped
public class HelloExceptionHandlerProvider implements ExceptionHandlerProvider {

    @Override
    public <ReqT, RespT> ExceptionHandler<ReqT, RespT> createHandler(ServerCall.Listener<ReqT> listener, ServerCall<ReqT, RespT> serverCall, Metadata metadata) {
        System.out.println("HelloExceptionHandlerProvider::createHandler");
        return new HelloExceptionHandler<>(listener, serverCall, metadata);
    }

    @Override
    public Throwable transform(final Throwable throwable) {
        return new StatusException().status(Status.INTERNAL); // TODO: transform the throwable to status exception
    }

    protected static class HelloExceptionHandler<I, O> extends ExceptionHandler<I, O> {

        public HelloExceptionHandler(ServerCall.Listener<I> listener, ServerCall<I, O> call, Metadata metadata) {
            super(listener, call, metadata);
        }

        @Override
        protected void handleException(Throwable throwable, ServerCall<I, O> call, Metadata metadata) {
            // This is never called!
            StatusException ex = (StatusException) throwable;
            call.close(ex.getStatus(), ex.getTrailers());
        }
    }
}

因此,在客户端,当抛出异常时,响应状态仍然是UNKNOWN(应该是INTERNAL),但有一个值为13的grpc-status元数据值(INTERNAL代码值)。

在日志中,除了缺少handleException调用外,一切正常:

HelloExceptionHandlerProvider::createHandler
HelloExceptionHandler::constructor
HelloExceptionHandlerProvider::transform - Should exit with status INTERNAL

我错过什么了吗?
另一个奇怪的事情是,如果我注解metadata.put(Metadata.Key.of("hello-error-code", Metadata.ASCII_STRING_MARSHALLER), ex.getCode());行,那么状态是INTERNAL,正如预期的那样,添加尾部元数据似乎会导致响应失败,状态为UNKNOWN

**编辑:**使用Quarkus gRPC客户端时似乎正常。在Postman界面中可以看到这种奇怪的行为。请参见https://github.com/quarkusio/quarkus/discussions/31110#discussioncomment-4956272

pgvzfuti

pgvzfuti1#

好的,同样的讨论--答案如下:

  • https://github.com/quarkusio/quarkus/discussions/31110#discussioncomment-4956320

相关问题