我无法按照预期的方式使用基本的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请求完全投放后才会返回。
我在HTTP
和HTTPS
听众身上测试了这一点。
增加XNIO线程数及其工作人员不会改变任何内容。随机XNIO被分配给请求。然后在调度后分配随机工作人员。服务器保持阻塞状态,直到请求被提供。
答案 0 :(得分:1)
您的代码看起来没问题,但查看BlockingHandler请尝试以下操作或直接使用BlockingHandler。
exchange.startBlocking();
if (exchange.isInIoThread()) {
exchange.dispatch(handler);
} else {
handler.handleRequest(exchange);
}
有关链接HttpHandler的简单方法,请查看MiddlewareBuilder。我还会尝试设置访问日志记录处理程序,以便您可以看到正在发生的事情以及处理每个请求的线程。