Ich habe über Async-Servlets 3.1 gelesen
Es wird gesagt, dass der Thread, der die Anforderung sendet, freigegeben wird, wenn viele zeitaufwändige Vorgänge ausgeführt werden müssen, um beispielsweise eine lange Liste von Daten aus der Datenbank abzurufen.
Ich kann den Vorteil hier nicht verstehen, da sowieso ein neuer Thread zugewiesen wird, um die Datenbankverbindung und die Antwortverarbeitung zu verarbeiten, selbst wenn der ursprüngliche Thread, der für die Anforderung verantwortlich war, freigegeben wird.
Wie ist das Async-Servlet vorteilhafter als das Thread-pro-Anfrage-Modell, das wir zuvor hatten?
Hier in zwei Teilen antworten:
Update: Weitere Details dazu, warum wir Async-Servlets benötigen, wenn wir bereits den NIO-Thread-Pool verwendet haben. Ich habe meine Notizen vor einiger Zeit über nicht blockierende E / A unter http://manish-m.com/?p=996 notiert . Sie können auch einen verwandten Beitrag unter http://manish-m.com/?p=915 anzeigen (insbesondere den Abschnitt "IO-Spielplatz" auf dieser Seite).
Der NIO-Thread-Pool dient zur Verarbeitung mehrerer Verbindungsanforderungen . Es verwendet die nicht blockierende E / A-Funktion von Kerneln, sodass eine kleine Anzahl von Threads mit vielen Verbindungen arbeiten kann.
Dieselben Threads, die Daten aus dem Netzwerkpuffer lesen, führen jedoch auch den "Benutzercode" aus (den wir in Servlets schreiben). Das Framework des Servlet-Containers für NIO übernimmt das Akzeptieren von Client-Anforderungen, kann jedoch keinen von uns geschriebenen "blockierenden Benutzercode" selbst verarbeiten. Wenn wir also eine DB-Abfrage schreiben, die beispielsweise 10 Sekunden dauert, kann das Container-Framework diese nicht asynchron selbst verarbeiten. Wir würden den ursprünglichen NIO-Thread-Pool blockieren, indem wir Blockierungscode in Servlets schreiben. Daher müssen wir explizit alles schreiben, von dem wir glauben, dass es die Anforderungsthreads des Containers als Async-Servlet in Java EE blockieren kann.
Wenn wir andere NIO-Frameworks wie Netty, MINA verwenden, müssen wir ebenfalls sicherstellen, dass der Code die NIO-Threads, die die Netzwerkverbindungen verarbeiten, nicht blockiert. Dies wird normalerweise erreicht, indem solche lang laufenden Aufgaben in einen anderen Thread-Pool verlagert werden (was der Container tut, wenn Sie ein asynchrones Servlet schreiben).
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen