使用dispatch进行阻塞操作无法正常工作

时间:2017-06-17 00:10:49

标签: undertow

我无法按照预期的方式使用基本的Undertow示例。以下代码应允许提供并发HTTP请求。实际发生的是,只有一个请求被处理,并且在第一个请求完成之前没有其他请求可以通过。

public class MainUT {

    public static void main(String[] args) {
        Undertow.builder()                                                      
            .addHttpListener(8080, "localhost")                                    
            .setHandler(new HttpHandler() {                                                   
                @Override
                public void handleRequest(final HttpServerExchange exchange) 
                                            throws Exception {
                    if(exchange.isInIoThread()){
                        exchange.dispatch(this);
                        return;
                    }
                    exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
                    exchange.getResponseSender().send("Hello World");               
                }
            }).build().start();
    }
}

我错过了什么?

我使用Chrome来执行GET请求,并在调度请求后暂停调试器。然后发出curl命令

 curl http://localhost:8080

curl命令仅在Chrome请求完全投放后才会返回。

我在HTTPHTTPS听众身上测试了这一点。

增加XNIO线程数及其工作人员不会改变任何内容。随机XNIO被分配给请求。然后在调度后分配随机工作人员。服务器保持阻塞状态,直到请求被提供。

1 个答案:

答案 0 :(得分:1)

您的代码看起来没问题,但查看BlockingHandler请尝试以下操作或直接使用BlockingHandler。

exchange.startBlocking();
if (exchange.isInIoThread()) {
    exchange.dispatch(handler);
} else {
    handler.handleRequest(exchange);
}

有关链接HttpHandler的简单方法,请查看MiddlewareBuilder。我还会尝试设置访问日志记录处理程序,以便您可以看到正在发生的事情以及处理每个请求的线程。