Using Asynchronous Servlets und das Verhalten der Methoden dispatch () und complete () während der Verarbeitung der Anfrage

8

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:

  1. Was genau ist der Unterschied zwischen async.dispatch() und async.complete() ?
  2. Wenn ich dispatch () (in run ()) anrufe, erreicht die Antwort den Client, das heißt, wir können die Antwort asynchron pushen?
  3. Wenn ich asyncContext.dispatch() first und asyncContext.complete() next anrufe, was ist das Verhalten des Threads?
  4. Wenn ich irgendeine Methode nach asyncContext.complete() aufrufen werde, was passiert mit diesem Methodenaufruf, wie unten gezeigt (in demselben run() )?
    [wenn ich das getestet habe, funktioniert es gut und zeigt dieselbe Thread-ID]
  5. Wenn ich asynchrone Methoden in run() aufruft, muss ich asyncContext.complete() in Callback () ? (onSuccess () oder onFailure ())
  6. Gibt es dafür Hilfe (Beispiel Quelle / Bücher / Online-Hilfe)? (Async Servlets und Futures Kombination)

    %Vor%

    Vielen Dank im Voraus.

Chandra Sekhar 04.04.2014, 15:44
quelle

1 Antwort

15

Aus dem Maul des Pferdes (Oracle Javadoc)

vervollständigen ()

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.

dispatch (String-Pfad)

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.

Q / A

  1. Was ist der Unterschied zwischen 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.

  2. Wenn ich 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.

  3. wenn ich 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.

  4. Wenn ich irgendeine Methode nach complete anrufe, was mit dieser Methode passieren wird, rufe

    auf

    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.

  5. Wenn ich asynchrone Methoden in 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.

  6. Gibt es Beispiele für die Verwendung von Async Servlets und Futures Kombination?

    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?"

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:

anttix 10.04.2014 02:54
quelle