我正在使用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 -> {...});