2

問題の説明: チャネル メッセージが ajax スクリプトに返されませんでした。最初は、メッセージはクライアント側に配信されますが、js でより大きなタイムアウトを設定すると問題が発生します。

goog.appengine.Socket.POLLING_TIMEOUT_MS = 5000; // 5 秒ごとにポーリングする

Channel API が Google App Engine アプリで機能するかどうかをテストするために、非常に基本的な Python コードを追加しました。

index:
token = channel.create_channel(CHANNEL_NAME)
channel.send_message(CHANNEL_NAME, message)
#token is passed to template

additional_view:
#is another view, trigger manually from browser after index
from django.utils import simplejson
channel.send_message(CHANNEL_NAME, simplejson.dumps(data))

クライアント側には、onMessage コードを含む通常の js があります。

問題は、クライアント側の要求にメッセージが返されないことです。それらはすべて ajax のポーリングに対して空になります (Firebug で見られるように)。アプリケーション ログで、チャネルが作成されたことを確認できます。

「Creating channel token channel-2382918168-broadcast with client id broadcast」 以降のメッセージが送信されますが、コメントが付きます。

間に次のリクエストがあります。

INFO     2011-08-03 14:33:32,000 dev_appserver.py:4248] "POST /_ah/channel/connected/ HTTP/1.1" 404 -
INFO     2011-08-03 14:33:33,780 dev_appserver.py:4248] "POST /_ah/channel/disconnected/ HTTP/1.1" 404 -

** ....メッセージ テキスト...キー付きチャネルへ (ブロードキャスト): クライアントが接続されていません***

チャネル/メッセージはより深いレベルでどのように機能しますか? クライアントが接続されていない場合、または新しく接続されたクライアントによって取得された場合、メッセージは失われますか? なんらかの理由で同じ名前のチャネルを作成した場合、内部にある未配信のメッセージは破棄されますか?

4

1 に答える 1

6

1.5 秒を超える値を設定しPOLLING_TIMEOUT_MSないでください。dev_appserver は、切断されたと見なします。

本番環境ではポーリングでは機能しないため、タイムアウトについて実際に心配する必要はありません。

編集:ロバートのコメントを見たところです。個人的には、Chrome/Safari/Firefox でポーリングを 3 秒に設定すると問題が発生することさえありました。?disable_channel=trueCPU 使用率でラップトップを起動せずに実行できるように、アプリにクエリ文字列があるだけです。

于 2011-08-03T17:27:25.007 に答える