2013-09-21 9 views
9

Ich versuche herauszufinden, wie meine SockJS-Clients sich wieder mit dem Server verbinden können, wenn er ausfallen sollte.SockJS Client automatisch wiederverbinden?

Im Moment habe ich dies:

new_conn = function() {  
     socket = new SockJS(protocol + serverDomain + '/echo', null, { 
      'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 'iframe-eventsource', 'iframe-htmlfile', 'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 'jsonp-polling'] 
     }); 
    }; 

    socket.onopen = function() { 
     clearInterval(recInterval); 
    }; 

    socket.onclose = function() {  
     recInterval = window.setInterval(function() { 
      new_conn(); 
     }, 2000); 
    }; 

Das Problem ist, dass die setInterval hält auch nach einem erfolgreichen Reconnect Brennen. Es scheint, dass die socket.onopen nie ausgeführt wird.

Irgendwelche Ideen, was ich falsch machen könnte?

+2

in Ihrem Fall mit setTimeout() sollte als setInterval besser sein() – Fielding34

+0

@ Fielding34 Eigentlich finde ich es ganz im Gegenteil - 'setInterval()' besser ist, weil OP halten will versuchen (während der Server heruntergefahren ist), bis es verbindet – TMG

Antwort

10

Ich denke, es könnte mit variabler Scoping verwandt sein. Versuchen Sie folgendes:

var recInterval = null; 

new_conn = function() {  
    socket = new SockJS(protocol + serverDomain + '/echo', null, { 
     'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 'iframe-eventsource', 'iframe-htmlfile', 'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 'jsonp-polling'] 
    }); 
}; 

socket.onopen = function() { 
    clearInterval(recInterval); 
}; 

socket.onclose = function() {  
    recInterval = window.setInterval(function() { 
     new_conn(); 
    }, 2000); 
}; 

Wie auch immer, es ist seltsam, weil Sie recInterval auf dem window Objekt erklärt wurden, und es sollte gearbeitet haben. Wenn es nicht funktioniert, können Sie es auch mit einem Browser mit debugger; Anweisungen oder interaktiv debuggen, indem Sie lokale Haltepunkte setzen ... (z. B. in onopen).

By the way, rewrited ich den ganzen Code wie folgt (I Refactoring mögen :):

var recInterval = null; 
var socket = null; 

var new_conn = function() {  
    socket = new SockJS(protocol + serverDomain + '/echo', null, { 
     'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 
           'iframe-eventsource', 'iframe-htmlfile', 
           'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 
           'jsonp-polling'] 
    }); 

    socket.onopen = function() { 
     clearInterval(recInterval); 
    }; 

    socket.onclose = function() {  
     recInterval = setInterval(function() { 
      new_conn(); 
     }, 2000); 
    }; 
}; 
6

Falls jemand noch Interesse an diesem Thema: Das Refactoring Code-Schnipsel aus franzlorenzon viel Reconnects verursacht seit Es ist irgendwie rekursiv, sich irgendwie neu zu verbinden, da alle zwei Sekunden ein neues onclose-Ereignis erzeugt wird (unabhängig vom recInterval).

Verschieben des Löschintervalls direkt nach der Socket-Erstellung macht den Trick. Ich habe auch ein Socket = null im onclose-Ereignis hinzugefügt.

var recInterval = null; 
 
var socket = null; 
 

 
var new_conn = function() { 
 
    socket = new SockJS(protocol + serverDomain + '/echo', null, { 
 
    'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 
 
     'iframe-eventsource', 'iframe-htmlfile', 
 
     'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 
 
     'jsonp-polling' 
 
    ] 
 
    }); 
 

 
    clearInterval(recInterval); 
 

 
    socket.onopen = function() { 
 

 
    }; 
 

 
    socket.onclose = function() { 
 
    socket = null; 
 
    recInterval = setInterval(function() { 
 
     new_conn(); 
 
    }, 2000); 
 
    }; 
 
};

+1

Danke für das Teilen. Es wäre auch schön, ein Back-Off-Protokoll zu haben, bei dem die Zeit zwischen den Wiederverbindungsversuchen zunimmt. Verringern Sie die Zeit für die erneute Verbindung, wenn der Benutzer "frustriert" ist, indem Sie das Scrollen in der App überwachen. Offensichtlich lösen sie einen Wiederverbindungsversuch aus, indem sie einfach die Seite neu laden. – coding

+0

@coding Ja, Sie haben Recht. Der obige Code ist nur ein Beispiel, das die Fehler aus dem vorherigen Beispiel behebt. Wir verwenden eine Lösung, wie Sie sie in unseren Produktionssystemen vorgeschlagen haben, und es funktioniert einwandfrei. Auch ich verwende eine ähnliche Lösung für private Projekte. Keine Komplikationen. :) – daPhantom