3

2つのAppEngine(Java)アプリケーションがあります。そのうちの1人はURLFetchを使用して他の人に予定を作成します。受信者には、チャンネルAPIを使用して開いているチャンネルがあるかどうかを確認し、新しいデータについて知らせる機能が追加されました。SocketTimeoutExceptionチャネルメッセージを送信するサービスへのURLFetchを使用

URLFetch呼び出しがSocketTimeoutExceptionで失敗しています。受信者のすべてのコードが実行されます(すべての開いているチャネルに通知されます)が、呼び出し元のアプリケーションはまだSocketTimeoutExceptionを取得します。私がチャネル通知行をコメントアウトするとき、エラーはありません。

これは、デプロイされたアプリケーションでのみ発生し、devモードでは発生しません。また、URLFetchで許可されている60秒(またはさらには10秒)のタイムアウトに近づくこともありません。

+0

コードとスタックトレースが表示されないと助けてくれません。 –

+0

私はサンプルをまとめましたが、私たちはそれを回避しました。チャネルに直接通知するのではなく、要求をタスクキューに送信します。このキューは同じことをしますが、SocketTimeoutExceptionを返しません。いずれにしても、元のものは標準的なサーブレットで、最後にChannelServiceFactory.getChannelService().sendMessageを呼び出すだけでした。 –

+0

アプリに固有のものでなければなりません。あるアプリから別のアプリにURLをフェッチすることは不可能ではありません。 –

答えて

0

urlfetchのデフォルトの締め切りは5秒です。したがって、アプリケーションがロードしてハンドラを実行するために5秒以上かかる場合、SocketTimeoutExceptionが返されます。

documentationで説明したように、あなたはまた、setConnectTimeoutまたはsetReadTimeout

を使用してのURLfetchコールのための長い期限を設定することができ、する必要が延期することができ、APIコール(すなわちないを移動するために、良いアイデアですtask queueに)HTTPレスポンスを構築する:

  • タスクキュー要求の期限が
  • を失敗した場合、タスクが再試行されます長い(10分の代わりに、60年代)
  • です
  • urlfetchのタイムアウトも長すぎます(10分)