Multithreading Vertx ExecuteBlock导致多个线程

Multithreading Vertx ExecuteBlock导致多个线程,multithreading,vert.x,Multithreading,Vert.x,我正在使用Vertx3.0运行一些mysql查询。因为该代码不是为异步操作设计的,所以我使用ExecuteBlock。即使代码运行,当我使用jconsole监视我的服务器时,我发现超过100个线程,其中大多数被命名为vert.x-worker-thread-0、vert.x-eventloop-thread-1和vertx blocked thread checker。这是因为我的代码有问题吗 public Handler<RoutingContext> getById()

我正在使用Vertx3.0运行一些mysql查询。因为该代码不是为异步操作设计的,所以我使用ExecuteBlock。即使代码运行,当我使用jconsole监视我的服务器时,我发现超过100个线程,其中大多数被命名为vert.x-worker-thread-0、vert.x-eventloop-thread-1和vertx blocked thread checker。这是因为我的代码有问题吗

    public Handler<RoutingContext> getById() {
    return (routingContext) -> {
        HttpServerResponse response = routingContext.response();
        String id = routingContext.request().getParam("id");
        int idAsInt = Integer.parseInt(id);
        Vertx.vertx().executeBlocking(future -> {
                Person p = svc.getPerson(idAsInt);
                PersonDTO dto = new PersonDTO(p.getId(), p.getFirstname(), p.getName());
                future.complete(dto);
            }, res -> {
                if (res.succeeded()) {
                    JsonUtil.setJsonResponse(response, 200, Json.encodePrettily(res.result()));
                }
                else {
                    JsonUtil.setJsonResponse(response, 404, new JsonObject().put("failure", res.cause().getMessage()).toString());
                }
                response.end();
            }
        );
    };
}
公共处理程序getById(){ 返回(路由上下文)->{ HttpServerResponse=routingContext.response(); 字符串id=routingContext.request().getParam(“id”); int-idAsInt=Integer.parseInt(id); Vertx.Vertx().ExecuteBlock(未来->{ 人员p=svc.getPerson(idAsInt); PersonDTO=newpersondto(p.getId(),p.getFirstname(),p.getName()); 未来。完成(dto); },res->{ 如果(res.successed()){ setJsonResponse(response,200,Json.encodeprettly(res.result()); } 否则{ setJsonResponse(response,404,newjsonobject().put(“failure”,res.cause().getMessage()).toString()); } response.end(); } ); }; }
你犯了和我一样的错误。Vertx的伙计们必须在他们的文档中明确地更新这一点

Vertx.Vertx()
每次启动一个新的Vertx实例时,每个请求都会有新的事件循环线程

缓存
Vertx.Vertx()
并每次使用缓存的Vertx实例

Vertx cachedVertx = Vertx.vertx();
...
cachedVertx.executeBlocking(future -> {...});
我通常会这样做:

fun vertxInstance(): Vertx {
    return Vertx.currentContext().owner()
}

//so call vertx this way 
vertxInstance().executeBlocking(future -> {},{})

您可能还对检查我的帖子是否存在类似的错误感兴趣,但如果您在某些路由代码中,则传递包含此缓存当前实例的路由上下文:
final Vertx Vertx=routingCtx.Vertx(),其中routingCtx的类型为
io.vertx.ext.web.RoutingContext