Lange Abfrage friert Browser ein und blockiert andere Ajax-Anfragen

7

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 ..: (

    
Dangling Piyush 08.10.2012, 06:41
quelle

7 Antworten

5

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)

    
lrsjng 13.10.2012, 12:42
quelle
9

Scheint so, als ob Sie die Sperrung der Sitzungsdatei erfahren haben

Für PHP

Verwenden Sie session_write_close() , wenn Sie keinen Sitzungswert benötigen

    
Domezchoc 14.12.2013 06:58
quelle
2

Ich habe ähnliches Problem getroffen, mein Browser war irgendwie mit AJAX-Anfragen festgefahren. Hinweis: Anstatt waitForMsg () direkt zu verwenden, versuchen Sie setTimeout ("waitForMsg ()", 10) .

    
ern0 12.10.2012 09:26
quelle
2

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.

    
les2 12.10.2012 19:14
quelle
2

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.

    
Tallmaris 18.10.2012 11:02
quelle
2

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:

  1. Wenn eine Anfrage die Sitzung öffnet, ist die Datei bis zur Sitzung gesperrt ist geschlossen.
  2. Wenn andere Anfragen auf den Server kommen, werden sie gesperrt, bis die Sitzung wird von der vorherigen Anfrage freigegeben.

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.

    
Alain Tiemblo 18.10.2012 22:04
quelle
1

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.

    
Fábio Santos 18.10.2012 09:10
quelle