2017-06-17 5 views
1

期待どおりに動作するように、非常に基本的なアンダートーの例はありません。次のコードでは、同時HTTP要求を処理できるようにする必要があります。実際には、1つのリクエストしか処理されず、最初のリクエストが完了するまで他のリクエストは処理できません。ディスパッチアンダーフローのブロック操作が機能していません

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コマンド

curl http://localhost:8080 

を発行しました。

私はHTTPHTTPSリスナーの両方でテストしています。

XNIOスレッド数とそのワーカーを増やしても何も変更されません。ランダムなXNIOが要求に割り当てられます。次に、無作為労働者が派遣された後に割り当てられます。要求が処理されるまで、サーバーはブロックされたままです。

+0

コードは大丈夫です。エラーはありますか?動作?どのようにテストしましたか?あなたのHTTPクライアントは何ですか? – Azeem

+0

エラーはありません。 ChromeからGETリクエストを発行すると、他のリクエストは終了するまでブロックされます。 –

+0

ブラウザがビジー状態になっていますか?同時リクエストはどうですか? – Azeem

答えて

1

あなたはコードがBlockingHandlerであることを確認していますが、以下を試してみるか、BlockingHandlerを直接使用してください。チェーンのhttpHandlersへの簡単な方法については

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

MiddlewareBuilderを見てください。また、アクセスログハンドラを設定して、何が起こっているのか、どのスレッドが各要求を処理しているのかを確認します。

+0

こんにちはビル、答えに感謝します。私はすでに 'BlockingHandler'を試していましたが、うまくいきませんでした。要求が別のスレッドによって処理されているのがわかりますが、サーバー全体がそれ以上の要求を受け入れることはできません。私はあなたの他の提案に従います。 –

+0

実際に動作していない正確な例を教えてください。あなたは、睡眠やそれらの線に沿って何かを使ってテストしていますか? –

+0

IDEでデバッガを使用している場合は、両方のスレッドを同じ時点で一時停止しませんか?待っていると思うようになりますが、実際には両方のスレッドがdebugステートメントにヒットしました。 –