1

公式ドキュメントによると、Google App EngineでのURLFetchを介したhttpリクエストのタイムアウトは、タスクから発行された場合は10分です。

https://developers.google.com/appengine/docs/java/urlfetch/overview#Quotas_and_Limits

残念ながら、何があっても250秒(4:10分)のタイムアウトが発生します

Apacheで実行されている単純なphpテストスクリプトとしてセットアップしました(ただし、Lighttpdでもテストしました)。これは、GAEから呼び出して300秒待ってから戻ります。

Httpフック:

echo "Starting to wait\n";

$waited = 0;
while($waited < 300) {
  sleep(5);
  $waited += 5;
  echo "Waited so far $waited seconds\n";
}

echo "all done\n";

呼び出しは常に約250秒後に失敗し、GAEログに次のエラーをスローします

IOException : Could not fetch URL ...

これはタイムアウト関連の例外でもありません

反対側では、Webサーバーはhttpリターンコード200で成功した呼び出しを記録します

呼び出しに使用しているJavaコードは次のとおりです

HTTPRequest httpReq = new HTTPRequest(new URL(http://example.com/very-slow.php),  HTTPMethod.GET, FetchOptions.Builder.allowTruncate().doNotValidateCertificate().setDeadline(3600d));

HTTPResponse resp = null;

try {
Future<HTTPResponse> futureResp = urlService.fetchAsync(httpReq);

log.info("Aync Call request lodged, waiting for a response");

resp = futureResp.get();

log.info("Aync Call completed");

} catch(Throwable th) {
log.warning("URLFetch execution error: " + th.getMessage());
}

運が悪ければ、あらゆる種類の異なる値を指定するsetDeadlineメソッドを試してみました。250秒未満の値を指定すると、その値が使用され、タイムアウト例外がスローされます。250秒を超えるものはすべて無視され、代わりに汎用IOExceptionがスローされます。

これはGAEのバグのように見えると確信しています。グーグルコードのバグリストを見た後、何年もの間、未解決のバグがいくつあるのかとびっくりしました...

この段階でGoogleAppEngineに非常に失望しています...

アップデート

  1. 影響を受けるのは実稼働環境のみです。開発サーバーでは問題は発生しません。ただし、タイムアウトは通常、開発サーバーでは強制されません...
  2. 同期と非同期の両方のURLFetchメソッドを試しました。同じ結果です。
  3. 低レベルのGAE独自のURLFetchまたはjava.netURLConnectionオブジェクトの両方で試しました:同じ結果
4

0 に答える 0