公式ドキュメントによると、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に非常に失望しています...
アップデート
- 影響を受けるのは実稼働環境のみです。開発サーバーでは問題は発生しません。ただし、タイムアウトは通常、開発サーバーでは強制されません...
- 同期と非同期の両方のURLFetchメソッドを試しました。同じ結果です。
- 低レベルのGAE独自のURLFetchまたはjava.netURLConnectionオブジェクトの両方で試しました:同じ結果