我正在使用vertx 3.0运行一些mysql查询。因为该代码不是为异步操作设计的,所以我使用了executeBlocking。即使代码运行了,当我使用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();
            }
        );
    };
}

最佳答案

您做的错误与我曾经做过的相同。 Vertx员工必须在其文档中明确更新此内容
Vertx.vertx()每次启动一个新的vertx实例,您最终都会在每个请求中都有新的事件循环线程。

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

Vertx cachedVertx = Vertx.vertx();
...
cachedVertx.executeBlocking(future -> {...});

10-07 18:58
查看更多