タイムアウトの例外を避けるために、urlfetchを書くにはどうすればよいですか? GAE/J + Facebookアプリ
-
27-10-2019 - |
質問
関数は非常に単純です:
public static String readURL(URL url, HTTPMethod method) throws IOException {
FetchOptions opt = FetchOptions.Builder.doNotValidateCertificate();
HTTPRequest request = new HTTPRequest (url, method, opt);
URLFetchService service = URLFetchServiceFactory.getURLFetchService();
HTTPResponse response = service.fetch(request);
byte[] content = response.getContent();
return new String(content);
}
問題は、時々私が例外を取得することです:
java.lang.RuntimeException: java.io.IOException: Timeout while fetching: https://graph.facebook.com...
私がやりたいことは、機能に対してしばらく()ループなどで機能することです。そのため、応答がそこにあるまで試してみます。最良のアプローチは何だと思いますか?私は正しい方向に向かっていますか、それともまったく違うものを提案しますか?他のいくつかの投稿で示唆されたように、タイムアウトを10秒に増やすと、問題の大部分を避ける必要がありますが、問題は根絶しません。
ありがとう。
PS 1:ライン FetchOptions opt = FetchOptions.Builder.doNotValidateCertificate();
別の問題を避けるために必要です、
HTTP ERROR 500
Problem accessing /auth. Reason:
javax.net.ssl.SSLHandshakeException: Could not verify SSL certificate for: https://graph.facebook.com/oauth/access_token?...
PS 2:これは、このスレッドのような問題ではありません。 googleappengine urlfetchタイムアウト例外 自分のサーバーではなく、Facebookサーバーを取得しているからです。どちらでもありません 「フェッチ中のタイムアウト」urlfetch gae/j 問題は非常に大きなフィードではなく、反応しないサーバー(テストユーザーによるリクエストの応答時に特に遅い)なので
解決
まず、urlfetchタイムアウトを増やします 10 seconds
, 、それは、より少ない上昇したタイムアウトの例外という点で大きな違いをもたらします。
WebハンドラーからFacebookデータを初めてダウンロードしようとします。タイムアウトの例外の場合、タスクをに移動します。 Taskqueue.
タスクに着くと、タイムアウトの例外が発生し、タスクが失敗した場合、App Engineは自動的に取得し、成功するまでURLのコンテンツをダウンロードしようとします。
import com.google.appengine.api.taskqueue.Queue;
import com.google.appengine.api.taskqueue.QueueFactory;
import static com.google.appengine.api.taskqueue.TaskOptions.Builder.*;
Queue downloadqueue = QueueFactory.getDefaultQueue();
queue.add(withUrl("/worker").param("url", urlToFetch))