Ich verwende asynchrone Servlets, um Anfragen zu bearbeiten,
Laut Google Docs :( complete () , dispatch () )
%Vor% Ich habe es nicht verstanden async.dispatch () , async.complete () und wie sie funktionieren.
Ich habe wenig Zweifel daran:
async.dispatch()
und async.complete()
? asyncContext.dispatch()
first und asyncContext.complete()
next anrufe, was ist das Verhalten des Threads? asyncContext.complete()
aufrufen werde, was passiert mit diesem Methodenaufruf, wie unten gezeigt (in demselben run()
)? run()
aufruft, muss ich asyncContext.complete()
in Callback () ? (onSuccess () oder onFailure ()) Gibt es dafür Hilfe (Beispiel Quelle / Bücher / Online-Hilfe)? (Async Servlets und Futures Kombination)
%Vor%Vielen Dank im Voraus.
Beendet den asynchronen Vorgang, der für die Anforderung gestartet wurde, die zum Initialisieren dieses AsyncContext verwendet wurde, und schließt die Antwort, die zum Initialisieren dieses AsyncContext verwendet wurde.
Alle Listener vom Typ AsyncListener, die mit der ServletRequest registriert wurden, für die dieser AsyncContext erstellt wurde, werden mit ihrer onComplete-Methode aufgerufen.
Sendet die Anfrage- und Antwortobjekte dieses AsyncContext an den angegebenen Pfad.
...
Die Kontrolle über die Anfrage und die Antwort wird an das Versandziel delegiert, und die Antwort wird geschlossen, wenn das Versandziel die Ausführung abgeschlossen hat, es sei denn, ServletRequest # startAsync () oder ServletRequest # startAsync (ServletRequest, ServletResponse) werden aufgerufen.
dispatch
und complete
? Der Aufruf von complete
veranlasst den Container, onComplete
Listener auszulösen und den asynchronen Modus zu stoppen. dispatch
weist den Container im Wesentlichen an, complete
aufzurufen und dann die Anfrage (intern) an den angegebenen Pfad weiterzuleiten. Der Pfad kann eine JSP, ein synchrones Servlet oder sogar ein anderes asynchrones Servlet sein, das eine neue asynchrone Verarbeitungsrunde auslöst.
dispatch
in run
aufgerufen habe, hat die Antwort den Client erreicht. Bedeutet das, dass wir die Antwort asynchron so drücken können? Im Gegensatz dazu schließt dispatch
den asynchronen Modus und leitet die Anfrage an ein anderes Servlet oder eine andere JSP weiter. Um Daten an den Client zu übertragen, müssen Sie in Response
object schreiben, das mit AsyncContext
verknüpft ist.
dispatch
first und complete
next anrufe, was ist das Verhalten des Threads? Nicht definiert, was eine nette Art ist, zu sagen, es hängt davon ab, wie der Container implementiert ist. Vielleicht wird es einen Fehler auslösen, vielleicht onComplete
Handler werden zweimal ausgelöst, vielleicht ruft complete
nichts auf, vielleicht gibt es eine Race-Bedingung zwischen Ihrem Thread und dem Container in aufrufenden Handlern und manipulieren interne Strukturen von AsyncContext
Implementierung etc.
complete
anrufe, was mit dieser Methode passieren wird, rufe Hängt davon ab, welche Methode Sie anrufen. Die Spezifikation besagt, dass dispatch
IllegalStateException
wirft, wenn sie nach complete
aufgerufen wird, alles andere ist undefiniert und somit implementierungsspezifisch.
run
aufruft, sollte ich complete
in callback () aufrufen? Ja, Sie müssen complete
aufrufen, um die asynchrone Verarbeitung zu beenden, wenn Sie fertig sind. Die run
-Methode wird verwendet, um eine Aufgabe zu planen, die von einem Container-verwalteten Thread-Pool ausgeführt wird, und sie kann während der Lebensdauer einer asynchronen Anforderung mehrmals aufgerufen werden.
Ich bin mir nicht bewusst, aber es gibt ein paar gute Beispiele für die Verwendung von asynchronen Servlets, die im Abschnitt "Siehe auch" verlinkt sind. Im Prinzip sehe ich keinen großen Wert darin, Futures zu verwenden. Siehe: "Passt das asynchrone Servlet zu dem, was ich gerade mache?"
Das Ziel eines asynchronen Servlets ist es, die Anzahl der Threads zu reduzieren, die benötigt werden, um bestimmte Arten von "Push-Clients" zu bedienen: Die HTTP-Anfrage bleibt offen, bis ein (normalerweise externes) Ereignis eintritt und der Server dann Daten in den Kanal pusht . In einer Standard-Servlet-Umgebung wird jedem Client ein dedizierter Thread zugeteilt und gewartet, wodurch wertvolle Systemressourcen verbraucht werden. Im asynchronen Modus kann die Client-Verbindung "gehalten" und von einem Ausführungs-Thread getrennt werden, bis ein Ereignis eintritt, das es ermöglicht, etwas damit zu tun. Denken Sie zum Beispiel an eine Online-Chat-Anwendung. Alle verbundenen Clients sind inaktiv, bis jemand eine Nachricht an den Raum sendet. Es ist verschwenderisch, einen dedizierten Thread für jeden verbundenen Benutzer zu behalten.
Wenn Ihre Anwendung mehrere Dienste gleichzeitig aufrufen muss und Sie Futures und Executoren zur Parallelisierung dieser Operation verwenden möchten, ist ein asynchrones Servlet wahrscheinlich nicht geeignet: Sie erhalten nichts und ein Standard-Servlet wird viel einfacher implementieren. Wenn andererseits Serviceaufrufe auf asynchrone Weise (nicht blockierend) erfolgen können, ohne sich auf Executoren mit Threads zu verlassen, dann ist das eine andere Geschichte.
Die richtige Frage ist: Will ich weniger Threads haben als aktive Verbindungen?
Siehe auch:
AsyncStateMachine
javadoc ( Tomcat-Implementierung). Tags und Links java asynchronous concurrency servlets guava