2012-12-19 9 views
5

mio Google App App Engine, che utilizza l'API Canale funziona bene per qualche tempo. A intermittenza, però, il codice js che si collega al canale genera un errore. In socket.onError, il codice di errore è impostato su 400 e la descrizione è impostata su una stringa vuota. Ho controllato che il token utilizzato per la connessione sia valido. Ho anche provato a ricreare il canale in socket.onError, chiamando prima socket.close() ma non sembra funzionare. Spesso c'è una serie di fallimenti prima di un successo. Il client js è in esecuzione su Safari su iOS. Qualsiasi idea su come risolvere o aggirare il problema sarà ben accolta. In questo momento, la soluzione migliore è continuare a provare finché non riesco, aumentando l'intervallo tra i tentativi su ciascun errore. L'API di presenza lato server non aiuta, poiché il collegamento "connesso" non viene chiamato in modo affidabile.codice intermittente errore 400, descrizione "" sul client che si connette al canale

risposta

4

E 'noto problema http://code.google.com/p/googleappengine/issues/detail?id=4940 ed è stato accettato. Come vedi lo stato del problema non è stato risolto. Sentiti libero di interpretarlo.

+0

Grazie. In risposta ai commenti in questo numero: 1. Ho provato la soluzione proposta di "eseguire il ping" di un canale stabilito ma ho scoperto che non impedisce l'errore. 2. La reimpostazione dell'ID client non aiuta, a volte l'errore si verifica con nuove connessioni. – er0

2

So doppio distacco è male (problema recitato & commento pubblicato) ... ma ho il sospetto questa discussione potrebbe ottenere più attenzione che i commenti emissione ^^

Per quanto ci riguarda, è per lo almeno un problema di documentazione:

https://developers.google.com/appengine/docs/java/channel/javascript ancora stati "una chiamata onerror è sempre seguita da una chiamata OnClose e l'oggetto del canale dovrà essere ricreato dopo questo evento"

e 'vero solo per, per quanto abbiamo indovinato, codici di errore 400 e 40 1 (che sono stringhe, non numeri, btw, quindi fai attenzione a === nel codice js).

Non è vero per altri codici di errore (abbiamo registrato almeno -1 codice).

Ci dovrebbe essere una documentazione che copre tutte le i codici di errore e la loro gestione (expected).

Atm, abbiamo un "channel manager" che riutilizza lo stesso token di canale quando il codice è non 400 o 401 e ciò assicura che onclose venga chiamato una volta sola una volta per Socket.

Prima di ciò, stavamo cercando di chiudere correttamente e riaprire (nuovo Socket sottostante) con un token nuovo di zecca: di solito abbiamo ricevuto un errore 400 seguito da un errore -1.

FUI in primo luogo abbiamo rilevato questo comportamento su iOS, poco tempo fa (regressione FTW? Prima che iOS era Dandy). Riapertura la presa dopo un codice -1 non è una panacea: a volte ci riuscirà (SuApertura propriamente detto), e poi non in silenzio (nessun messaggio ricevuto, senza onerror chiamato).

In generale, abbiamo anche notato un comportamento più coerente sui browser desktop rispetto a quelli mobili, in tutti gli interpreti e le piattaforme (più su che:!! Yay Altri problemi in arrivo Soprattutto Android ...)

OK, questo post potrebbe essere stato utile dopotutto. Grazie!

[EDIT: corretto un errore ... non riutilizzare l'oggetto del canale né l'oggetto socket, solo il token]

+0

Sto osservando questo problema anche su iOS. Hai risolto il problema su iOS utilizzando il metodo descritto sopra? Se è così, allora potresti chiarire la tua soluzione. A quanto ho capito: 1. Per gli errori 400 e 401, a) ricreare il socket. b) assicurati che onClose non venga chiamato due volte 2) Per errore -1, riutilizza il socket '(cosa vuol dire esattamente)? – er0

+1

1) a) Sì. Ciò significa che chiamiamo esplicitamente il metodo close dell'oggetto goog.appengine.Socket se il nostro stato interno lo consente (vedi sotto). Quindi ricreamo un canale, un oggetto Socket, ecc. (Tutto il flusso di lavoro) –

+1

1) b) Dopo aver creato un oggetto Canale, passiamo un oggetto contenente i 4 callback previsti (onopen, onclose, onmessage, onerror) al metodo aperto. I callback sono tutte le chiusure che ci consentono di mantenere uno stato coerente globale per "l'attuale ambiente del canale". Usa il tuo schema preferito ... ^^ –

1

Ho contattato il supporto di Google su questo problema.

Quando si verifica un errore 400 è perché si è verificato un timeout (un minuto sembra).Questo timeout genera una disconnessione (viene chiamato url disconnected e si deve rimuovere l'id client del database). Quindi, è necessario creare un nuovo canale con un nuovo ID client.

Ma non è abbastanza. Dobbiamo usare questa linea di comando jquery: $ ('# wcs-iframe'). Remove();
Appena dentro la funzione js onerror e prima di provare a ricreare il canale.

Problemi correlati