Vertx executeBlocking 导致许多线程
Vertx executeBlocking resulting in many threads
我正在使用 vertx 3.0 来 运行 一些 mysql 查询。因为该代码不是为异步操作而设计的,所以我正在使用 executeBlocking。即使代码 运行s,当我使用 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 cachedVertx = Vertx.vertx();
...
cachedVertx.executeBlocking(future -> {...});
我通常这样做:
fun vertxInstance(): Vertx {
return Vertx.currentContext().owner()
}
//so call vertx this way
vertxInstance().executeBlocking(future -> {},{})
我正在使用 vertx 3.0 来 运行 一些 mysql 查询。因为该代码不是为异步操作而设计的,所以我正在使用 executeBlocking。即使代码 运行s,当我使用 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 cachedVertx = Vertx.vertx();
...
cachedVertx.executeBlocking(future -> {...});
我通常这样做:
fun vertxInstance(): Vertx {
return Vertx.currentContext().owner()
}
//so call vertx this way
vertxInstance().executeBlocking(future -> {},{})