Quarkus:在事件循环中阻止 grpc 服务方法 运行

Quarkus: Blocking grpc service method running on event loop

我正在 quarkus (1.8.3.Final) 中实现一个 gprc 服务器。 我的服务是用反应式编写的(smallrye mutiny) 这是我的服务class

@Singleton
@Blocking
@Slf4j
public class GrpcService extends MutinyGrpcServicesGrpc.GrpcServicesImplBase{

  @Blocking
  public Uni<MyResponse> executeMyLogic(MyRequest request) {
     System.out.println("grpc thread name "+Thread.currentThread().getName());
     ...
  }
}

现在 executeMyLogic 中编写的实际逻辑有点阻塞,导致 vertx 阻塞事件循环警告(和一些其他错误)。 所以正如 quarkus grpc 服务器指南中提到的那样(https://quarkus.io/guides/grpc-getting-started) 我用 @Blocking (io.smallrye.common.annotation.Blocking).

注释了该方法

在添加此注释之前,我在 sys.out 上获得了此日志 grpc thread name vert.x-eventloop-thread-0 这表明此逻辑在 vertx 事件循环中 运行,这似乎是导致问题的原因。

现在根据我的理解,在 executeMyLogic 上添加此 @Blocking 注释后,这应该 运行ning 在某些工作线程上。 但它仍然 运行ning on vertx 事件循环。

这个注解似乎没有被框架接受。

如果我的理解有误,请纠正我,否则请帮助我解决这个问题。

事实证明这是 quarkus 框架中的一个错误。 早些时候它不支持@Blocking 注释。 升级到 1.10.2.Final

后有效

Here's a link to the PR that fixed it