長時間実行されるプロセスの http リクエストを処理する App Engine バックエンドを作成しました。クエリが小さいサイズの入力を参照する場合、バックエンド プロセスは期待どおりに動作しますが、入力サイズが大きい場合はタイムアウトになります。クエリ パラメータは、バックエンド プロセスの入力データである App Engine BlobStore blob の URL です。App Engine バックエンドを使用することの要点は、App Engine フロントエンドが持つタイムアウト制限を回避することだと思いました。タイムアウトを回避するにはどうすればよいですか?
接続タイムアウトの長さを無限に設定して、次のようにバックエンドを呼び出します。
HttpURLConnection connection = (HttpURLConnection)(new URL(url + "?" + query).openConnection());
connection.setRequestProperty("Accept-Charset", charset);
connection.setRequestMethod("GET");
connection.setConnectTimeout(0);
connection.connect();
InputStream in = connection.getInputStream();
int ch;
while ((ch = in.read()) != -1)
json = json + String.valueOf((char) ch);
System.out.println("Response Message is: " + json);
connection.disconnect();
トレースバック(匿名用に編集)は次のとおりです。
Uncaught exception from servlet
java.net.SocketTimeoutException: Timeout while fetching URL: http://my-backend.myapp.appspot.com/somemethod?someparameter=AMIfv97IBE43y1pFaLNSKO1hAH1U4cpB45dc756FzVAyifPner8_TCJbg1pPMwMulsGnObJTgiC2I6G6CdWpSrH8TrRBO9x8BG_No26AM9LmGSkcbQZiilhC_-KGLx17mrS6QOLsUm3JFY88h8TnFNer5N6-cl0iKA
at com.google.appengine.api.urlfetch.URLFetchServiceImpl.convertApplicationException(URLFetchServiceImpl.java:142)
at com.google.appengine.api.urlfetch.URLFetchServiceImpl.fetch(URLFetchServiceImpl.java:43)
at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.fetchResponse(URLFetchServiceStreamHandler.java:417)
at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getInputStream(URLFetchServiceStreamHandler.java:296)
at org.someorg.server.HUDXML3UploadService.doPost(SomeService.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
ご覧のとおり、DeadlineExceededException が発生していないため、Google の制限以外の原因でタイムアウトが発生していると考えられます。また、このトピックに関する同様のスタックオーバーフローの投稿とは別の問題になっています。
洞察に感謝します。
2012 年 2 月 19 日更新: 何が起こっているかわかりました。クライアントリクエストが完了するまで、GWT [または他のタイプのクライアント側非同期フレームワーク]非同期ハンドラーを使用して、クライアントを無期限に待機させることができるはずなので、それが問題だとは思いません。問題は、ファイルのアップロードが _ah/upload App Engine システム エンドポイントを呼び出しており、ブロブが Blobstore に保存されると、アップロード サービスの doPost バックエンドを呼び出してブロブを処理することです。バックエンドがタイムリーに返されないため、_ah/upload へのクライアント リクエストがタイムアウトになります。このタイムアウトの問題を解消するために、_ah_upload サービス自体をhttp://backend_name.project_name.appspot.com/_ah/uploadからアクセスできるパブリック バックエンドにしようとしました。、しかし、Google がシステム サービス (_ah/upload など) をバックエンドとして実行することを許可しているとは思いません。私の次のアプローチは、バックエンド処理をトリガーした直後に ah_upload を返して、処理が終了した後に別のサービスを呼び出して、必要な元の応答を取得することです。