我有一个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
1条答案
按热度按时间pgvzfuti1#
好的,同样的讨论--答案如下: