Ich versuche, lange Abfragen in meiner Spring-MVC Web App zu implementieren > Aber es friert meinen Browser und andere Anfrage nach 4-5 AJAX-Anfragen fort. Ich habe keine Ahnung, was hier los ist, ist mein relevanter Code.
Die Controller-Methode: (Server Side): -
%Vor%Das Skript für lange Abfragen (Clientseite): -
%Vor%UPDATE:
%Vor%Keine Alarmbox erscheint ..: (
Es sieht so aus, als hätten Sie eine leere while-Schleife in Ihrem Browser-Code. Dies ist eine sehr CPU-intensive Art, auf ein Ereignis zu warten.
Wenn keine Ereignisse eintreten, wird der Client die Anfrage nach dem gewünschten Timeout von 50 Sekunden beenden. Aber ich bin nicht sicher, ob der Server-Thread auch getötet wird, oder ob er für immer "while" ist (es sei denn, es gibt ein Ereignis). Die nächste Anfrage startet einen zweiten Server-Thread, der dann ebenfalls in der while-Schleife hängt. Vielleicht ist die Menge an leeren while-Schleifen für den Server ein Overkill, so dass er keine weiteren Anfragen mehr akzeptiert. Nach einigen Anfragen (die jeweils einen endlosen Server-Thread ausgelöst haben) wartet der Client für immer auf eine neue Anfrage .. weil er vom Server nicht bearbeitet werden kann.
ps: Bei Erfolg haben Sie kommentiert, um 1 Sekunde zu warten, aber setzen Sie das Timeout auf 10000 (10 Sekunden)
Zu Ihrer Information, hier ist ein Projekt, das Ihnen helfen könnte: Ссылка
Im Allgemeinen würde ich nach JavaScript-Comet-APIs suchen, die Web-Sockets unterstützen können, wenn sie auf dem Client / Server verfügbar sind, mit einem eleganten Fallback auf Long-Polling. Die API sollte alle Details behandeln, so dass Sie sich auf die Anwendung konzentrieren können.
Hier ist ein Link zu einem alten Dojo-Artikel zum Thema: Ссылка
Viel Glück.
Sie können versuchen, das Verhalten mit jQuery deferred neu zu schreiben:
%Vor% errorHandler
und successHandler
werden Ihr Erfolg sein: und error: Callbacks, die ich zur Verdeutlichung weggelassen habe, wobei ihr setTimeout-Teil entfernt wurde (da er jetzt Teil der Callbacks von defered.done () und .fail () ist) ).
Lass es mich wissen, wenn es funktioniert.
Ich bin ein PHP-Entwickler, aber ich habe Ihr Problem gelöst und es könnte das gleiche Verhalten sein. Also gebe ich dir meine 2 Cent und hoffe, es wird dir helfen.
Die Zeile, die mich vermuten lässt, ist:
%Vor%In PHP werden Sitzungen in Dateien gespeichert, und wenn wir in einem geöffneten PHP-Skript lange pollen, treffen wir eine Race Condition Problem.
Das Prinzip ist ziemlich einfach:
Wenn bei einem langen Polling die Sitzung geöffnet und nicht geschlossen wird, nachdem Informationen eingeholt wurden (zumindest kurz bevor auf Ereignisse gewartet wird), werden alle Anfragen nur noch gesperrt. Sie können nirgendwo anders auf der Website zugreifen Sie verwenden Sitzungen auf anderen Seiten. Selbst wenn Sie eine neue Registerkarte öffnen, weil für einen Browser nur eine Sitzung vorhanden ist, sind Sie gesperrt.
Es könnte das sein:
%Vor%in Ihrer Funktion waitForMsg.
Versuchen Sie
%Vor%Es kann sein, dass Sie xhr im globalen Objekt deklarieren, was es unmöglich macht, auf zwei verschiedene Anfragen zu antworten.
Tags und Links java jquery ajax spring-mvc long-polling