我有一个简单的基于http vertx的服务器,代码如下:
public class JdbcVertx extends AbstractVerticle{
private static int cnt;
@Override
public void start() throws Exception {
this.vertx.createHttpServer()
.requestHandler(request -> {
JdbcVertx.cnt++;
System.out.println("Request "+JdbcVertx.cnt+" "+Thread.currentThread().getName());
this.vertx.executeBlocking(future -> {
System.out.println("Blocking: "+Thread.currentThread().getName());
final String resp = this.dbcall();
future.complete(resp);
}, asyncResp -> {
request.response().putHeader("content-type", "text/html");
if (asyncResp.succeeded()) {
request.response().end(asyncResp.result().toString());
} else {
request.response().end("ERROR");
}
});
}).listen(8080);
}
private String dbcall(){
try {
Thread.sleep(2000);
System.out.println("From sleep: "+Thread.currentThread().getName());
} catch (InterruptedException ex) {
Logger.getLogger(JdbcVertx.class.getName()).log(Level.SEVERE, null, ex);
}
return UUID.randomUUID().toString();
}
从官方文档我已经读过默认工作池大小为20.但这是我的输出
Request 1 vert.x-eventloop-thread-0
Blocking: vert.x-worker-thread-0
Request 2 vert.x-eventloop-thread-0
Request 3 vert.x-eventloop-thread-0
Request 4 vert.x-eventloop-thread-0
Request 5 vert.x-eventloop-thread-0
From sleep: vert.x-worker-thread-0
Blocking: vert.x-worker-thread-0
Request 6 vert.x-eventloop-thread-0
From sleep: vert.x-worker-thread-0
我有两个问题:
1)为什么我的Verticle只使用一个工作线程?
2)从输出
Request 1 vert.x-eventloop-thread-0
Blocking: vert.x-worker-thread-0
Request 2 vert.x-eventloop-thread-0
Request 3 vert.x-eventloop-thread-0
Request 4 vert.x-eventloop-thread-0
Request 5 vert.x-eventloop-thread-0
服务器获取第一个请求,将其放入工作线程然后获得2,3,4,5个请求。为什么它以这种方式工作?也许响应被放入工作池的队列中?
提前感谢
BTW我使用控制台(vertx run JdbcVertx.java
)
答案 0 :(得分:2)
这是一个很好的问题
executeBlocking()
实际上有三个参数blockingHandler
,ordered
和resultHandler
当您仅使用两个参数调用它时,ordered
默认为true
因此,同一上下文中的所有请求都将收到相同的工作线程 - 它们按顺序执行
将其设置为false
以查看所有工作线程是否开始工作
你也可以查看我的这个例子:
https://github.com/AlexeySoshin/VertxAnswers/blob/master/src/main/java/clientServer/ClientWithExecuteBlocking.java
在这里你可以看到它实际上被放入队列: https://github.com/eclipse/vert.x/blob/master/src/main/java/io/vertx/core/impl/ContextImpl.java#L280