Channel API を使用する私の Google App Engine アプリは、うまく動作する場合があります。ただし、断続的に、チャネルに接続する js コードでエラーが発生します。socket.onError では、エラー コードは 400 に設定され、説明は空の文字列に設定されます。接続に使用されているトークンが有効であることを確認しました。また、最初に socket.close() を呼び出して、socket.onError でチャネルを再作成しようとしましたが、うまくいかないようです。多くの場合、成功の前に一連の失敗があります。クライアント js は iOS の Safari で実行されています。問題を修正または回避する方法についてのアイデアは大歓迎です。現時点での最善の回避策は、成功するまで試行を続け、失敗するたびに試行の間隔を延ばすことです。「接続済み」フックが確実に呼び出されないため、サーバー側のプレゼンス API は役に立ちません。
3 に答える
これは既知の問題http://code.google.com/p/googleappengine/issues/detail?id=4940であり、受け入れられました。ご覧のとおり、問題のステータスは修正されていません。お気軽にスターを付けてください。
二重投稿が悪いことはわかっています (問題にスターを付けてコメントを投稿)...しかし、このスレッドは問題のコメントよりも注目されるのではないかと思います ^^
私たちに関する限り、これは少なくともドキュメントの問題です。
https://developers.google.com/appengine/docs/java/channel/javascriptには、「 onerror 呼び出しの後には常に onclose 呼び出しが続き、このイベントの後にチャネル オブジェクトを再作成する必要がある」と記載されています。
私たちが推測した限りでは、エラー コード 400 と 401 (数値ではなく文字列なので、js コードの === に注意してください) にのみ当てはまります。
他のエラー コードには当てはまりません (少なくとも -1 コードをログに記録しました)。
すべてのエラー コードとその (予想される) 管理をカバーするドキュメントが必要です。
Atm、コードが 400 または 401 でない場合に同じチャネル トークンを再利用し、 onclose が Socket ごとに 1 回だけ呼び出されるようにする「チャネル マネージャ」があります。
その前に、適切に閉じて、光沢のある真新しいトークンで (新しい基になるソケット) を再度開いてみました。通常、エラー 400 の後にエラー -1 が続きます。
FUI は、iOS でこの動作を最初に検出したのはごく最近のことです (回帰 ftw? その前の iOS はダンディでした)。コード -1 の後にソケットを再度開くことは万能薬ではありません: 場合によっては成功し (onopen が適切に呼び出されます)、サイレントに失敗します (メッセージが受信されず、onerror が呼び出されません)。
一般的に、すべてのユーザー エージェントとプラットフォームで、モバイル ブラウザーよりもデスクトップ ブラウザーでより一貫した動作が見られることにも気付きました (詳細: やった!他の問題が近づいています!特に android...)
わかりました、結局、この投稿は役に立ったかもしれません。どうも!
[編集: 間違いを修正しました... チャネル オブジェクトもソケット オブジェクトも再利用せず、トークンのみを再利用します]
この問題について Google サポートに問い合わせました。
エラー 400 が発生するのは、タイムアウト (1 分のようです) が発生したためです。このタイムアウトにより切断が発生します (url disconnected が呼び出され、データベースのクライアント ID を削除する必要があります)。次に、新しいクライアント ID を使用して新しいチャネルを作成する必要があります。
しかし、それだけでは十分ではありません。この jquery コマンドラインを使用する必要があります: $('#wcs-iframe').remove();
js onerror 関数のすぐ内側で、チャネルの再作成を試みる前に。