2017-06-17 74 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中使用調試器,它不會在同一點暫停兩個線程嗎?讓你認爲它正在等待,但實際上兩個線程都只是觸發了調試語句。 –