0
私はUndertowで真の非同期のhttpサーバを構築する方法を理解しようとします。どのリクエストを既に処理している別のスレッドがある場合、非同期的にレスポンスを送信するのですか?
は、私はこのようなコードを書いた:データなしとし、ログにUndertown。他のスレッドとの非同期応答
Undertow server = Undertow.builder()
.addHttpListener(8080, "localhost")
.setHandler(exchange -> {
CompletableFuture.runAsync(() -> {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}).thenAccept(string -> {
exchange.getResponseHeaders()
.put(Headers.CONTENT_TYPE, "text/plain");
exchange.getResponseSender().send("Hello World");
exchange.endExchange();
}).exceptionally(throwable -> {
System.out.println(throwable.toString());
return null;
});
}).build();
server.start();
が、このサーバーの応答200を
java.lang.IllegalStateException:UT000127:レスポンスがすでに送信されてい
io.undertow.server.HttpServerExchange#dispatch(java.lang.Runnable)メソッドを次のように使用すると:
Undertow server = Undertow.builder()
.addHttpListener(8080, "localhost")
.setHandler(exchange -> {
exchange.dispatch(() -> {
CompletableFuture.runAsync(() -> {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}).thenAccept(string -> {
exchange.getResponseHeaders()
.put(Headers.CONTENT_TYPE,"text/plain");
exchange.getResponseSender().send("Hello World");
exchange.endExchange();
}).exceptionally(throwable -> {
System.out.println(throwable.toString());
return null;
});
});
}).build();
server.start();
もちろん "Hello World"は期待通りですが、サーバーはリクエストごとに新しいスレッドを作成します!
P.S.を私は主な方法でそれを実行します。 – QIvan