12

Undertow を使用して単純なアプリケーションを作成しています。

public class App {
    public static void main(String[] args) {
        Undertow server = Undertow.builder().addListener(8080, "localhost")
                .setHandler(new HttpHandler() {

                    public void handleRequest(HttpServerExchange exchange) throws Exception {
                        Thread.sleep(5000);
                        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
                        exchange.getResponseSender().send("Hello World");
                    }

                }).build();
        server.start();
    }
}

でブラウザーのタブlocalhost:8080を開き、2 つ目のタブも開きますlocalhost:8080

今回は、最初のタブが 5 秒間待機し、2 番目のタブが 10 秒間待機します。

なぜそうなのですか?

4

3 に答える 3

13

HttpHandlerは I/O スレッドで実行されていますドキュメントに記載されているように:

IO スレッドは非ブロッキング タスクを実行し、複数の接続を担当するため、ブロッキング操作を実行しないでください。操作がブロックされている間、他の接続は基本的にハングします。CPU コアごとに 1 つの IO スレッドが妥当なデフォルトです。

リクエスト ライフサイクルのドキュメントでは、リクエストをワーカー スレッドにディスパッチする方法について説明しています。

import io.undertow.Undertow;
import io.undertow.server.*;
import io.undertow.util.Headers;

public class Under {
  public static void main(String[] args) {
    Undertow server = Undertow.builder()
        .addListener(8080, "localhost")
        .setHandler(new HttpHandler() {
          public void handleRequest(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();
    server.start();
  }
}

要求ごとに 1 つのワーカー スレッドを取得するとは限らないことに注意しました。ヘッダー put にブレークポイントを設定すると、クライアントごとに約 1 つのスレッドが取得されます。Undertow と基礎となるXNIO ドキュメントの両方にギャップがあるため、意図がわかりません。

于 2014-02-28T12:34:17.623 に答える