Ich versuche zu erkennen, wie Sie einen True-Async-HTTP-Server mit Undertow erstellen. Wie sende ich eine asynchrone Antwort, wenn ich einen anderen Thread habe, der bereits eine Anfrage bearbeitet?
schrieb ich Code wie folgt:Undertown. Async-Antwort mit einem anderen Thread
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();
aber diese Server-Antwort 200 ohne Daten und Protokolle
abgeschicktjava.lang.IllegalStateException: UT000127: Response hat bereits
Wenn ich io.undertow.server.HttpServerExchange # Versand (java.lang.Runnable) Methode wie folgt verwenden:
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();
natürlich eine Antwort "Hallo Welt" wie erwartet, aber Server erstellt neuen Thread für jede Anfrage!
(jvisualvm nach 10 parallel Anfragen)
P. S. Ich betreibe es in einer Hauptmethode. – QIvan