2017-06-17 61 views
1

我不能得到非常基本的Undertow示例按预期工作。以下代码应该允许提供并发HTTP请求。实际发生的情况是,只有一个请求被处理,并且在第一个请求完成之前,没有其他请求可以通过。Undertow阻止操作与调度不起作用

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命令只有在浏览器请求被彻底服了返回。

我测试了这两个HTTPHTTPS听众。

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

+0

你的代码看起来没问题。任何错误?行为?你是如何测试它的?什么是您的HTTP客户端? – Azeem

+0

没有错误。当从Chrome发布GET请求时,它会阻止任何其他请求,直到完成。 –

+0

您的浏览器忙吗?你怎么同时请求? – Azeem

回答

1

你的代码看起来不错,但看着BlockingHandler请尝试以下操作或直接使用BlockingHandler。

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

对于一个简单的方式来链HttpHandlers看看MiddlewareBuilder。我也会尝试设置访问日志记录处理程序,以便您可以看到发生了什么以及哪个线程处理每个请求。

+0

嗨比尔,谢谢你的回答。我已经尝试过'BlockingHandler'它没有工作。我可以看到请求由另一个线程处理,但整个服务器无法接受任何更多请求。我会遵循你的其他建议。 –

+0

你能否给出一个不起作用的确切例子?你是否正在使用睡眠或沿着这些线路进行测试? –

+0

如果您在IDE中使用调试器,它不会在同一点暂停两个线程吗?让你认为它正在等待,但实际上两个线程都只是触发了调试语句。 –