2

関数は非常に単純です。

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...

私がやりたいのは、 while() ループなどで関数を実行することです。そのため、応答があるまで試行を続けます。最善のアプローチは何だと思いますか?私は正しい方向に向かっていますか、それともまったく違うものを提案しますか? 他の投稿で提案されているように、タイムアウトを 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のようなものでもありません。これは、問題が非常に大きなフィードではなく、応答しないサーバー (テスト ユーザーからの要求に応答するときに特に遅い) にあるためです。

4

1 に答える 1

4

まず、urlfetch タイムアウトを に増やし10 secondsます。これにより、発生するタイムアウト例外が少なくなるという点で大きな違いが生じます。

初めて Web ハンドラーから Facebook データをダウンロードしようとし、TimeOut 例外が発生した場合は、タスクをTaskQueueに移動します。

TaskQueue に入ると、TimeOut 例外が発生して Task が失敗した場合、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))
于 2011-03-19T13:33:48.273 に答える