Vertx executeBlocking导致许多线程

时间:2016-01-05 13:27:43

标签: multithreading vert.x

我使用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();
            }
        );
    };
}

2 个答案:

答案 0 :(得分:4)

你和我曾经犯过同样的错误。 Vertx的人必须在他们的文档中明确更新它

Vertx.vertx()每次启动一个新的vertx实例,你最终会得到每个请求的新事件循环线程。

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

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

答案 1 :(得分:0)

我通常这样做:

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

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