Vertx http服务器只使用一个工作线程实例

时间:2018-04-01 15:32:29

标签: java asynchronous vert.x

我有一个简单的基于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

进行部署

1 个答案:

答案 0 :(得分:2)

这是一个很好的问题 executeBlocking()实际上有三个参数blockingHandlerorderedresultHandler
当您仅使用两个参数调用它时,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