2008-09-07 13 views
6

Ich verwende den Apache CXF Web Services-Stack. Wenn ein Client das Zeitlimit überschreitet oder die Verbindung zum Server trennt, bevor die Operation abgeschlossen ist, führt der Server den Vorgang bis zum Abschluss fort. Ich möchte den Server erkennen lassen, wenn der Client die Verbindung trennt und entsprechend behandeln.Erkennung von Client-Verbindungen in Web-Services

Gibt es eine Möglichkeit festzustellen, wenn ein Client die Verbindung mit Apache CXF trennt? Was ist mit anderen Java Web-Services-Stacks?

Antwort

2

Ich bin nicht vertraut mit Apache CXF, aber das Folgende sollte für jedes Java-Servlet-basierte Framework gelten.

Um festzustellen, ob ein Benutzer die Verbindung getrennt hat (Stopptaste, geschlossener Browser usw.), muss der Server versuchen, ein Paket zu senden. Wenn die TCP/IP-Verbindung geschlossen wurde, wird IOException ausgelöst.

Theoretisch könnte eine Java-Anwendung an verschiedenen Punkten während der Verarbeitung ein Leerzeichen senden. Ein IOException würde signalisieren, dass der Client gegangen ist und die Verarbeitung abgebrochen werden kann.

Allerdings kann es ein paar Probleme mit dieser Technik sein:

  1. Zeichen während der Verarbeitung gesendet wird bewirken, dass die Antwort „committed“ sein, so kann es unmöglich sein HTTP-Header zu setzen, Cookies, etc. basierend auf dem Ergebnis der langjährigen serverseitigen Verarbeitung.

  2. Wenn der Ausgabestrom gepuffert ist, werden die Leerzeichen nicht sofort gesendet, wodurch kein ausreichender Test durchgeführt wird. Es kann möglich sein, flush() als eine Problemumgehung zu verwenden.

  3. Es kann schwierig sein, diese Technik für eine bestimmte Framework- oder Ansichtstechnologie (JSP, usw.) zu implementieren. Zum Beispiel kann der Seitenrendercode den Inhaltstyp nicht senden, nachdem die Antwort festgeschrieben wurde.