0

私の目標は、appengine(java)からサーバーに迅速に投稿することです。UrlFetchService.fetchAsyncを使用してこれを実行しようとしています。私はこのブログ投稿の後に自分のコードを基にしています。以下のコードを使用してリクエストを行うことができましたが、奇妙な動作が発生します。

private void futureRequests() {
    URLFetchService fetcher = URLFetchServiceFactory.getURLFetchService();
    URL url = new URL("https://someserver.com");

    FetchOptions fetchOptions = FetchOptions.Builder.withDefaults();
    fetchOptions.doNotValidateCertificate();
    fetchOptions.setDeadline(60D);

    ArrayList<Future<HTTPResponse>> asyncResponses = new ArrayList<Future<HTTPResponse>>();

    for (int i = 0; i < postDatas.size(); i++) {

        HTTPRequest request = new HTTPRequest(url, HTTPMethod.POST, fetchOptions);
        request.setPayload(postDatas.get(i).getBytes(UTF8));
        HTTPHeader header = new HTTPHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
        request.setHeader(header);
        header = new HTTPHeader("Content-Length", Integer.toString(postDatas.get(i).getBytes().length));
        request.setHeader(header);
        header = new HTTPHeader("Authorization", "auth=" + authToken);
        request.setHeader(header);
        Future<HTTPResponse> responseFuture = fetcher.fetchAsync(request);
        asyncResponses.add(responseFuture);
    }

    for (Future<HTTPResponse> future : asyncResponses) {
        HTTPResponse response;
        try {
            response = future.get();
            int responseCode = response.getResponseCode();
            resp.getWriter().println("response: " + responseCode);
            logger.warning("Response: " + responseCode);

        } catch (Exception e) {
        }
    }
}

奇妙な動作は、サーバー上で重複した投稿を取得することです。私のappstatsページによると、上記のコードで追加されたものよりも10倍から20倍多いurlFetchesを使用しています。以下は私のappstats画面です:

Appstatsのスクリーンショット

画面に収まらないurlFetch呼び出しが他にもあります。リクエストはまだ同期して完了しているようです(丸で囲んだ項目)が、同時に進行しているように見える多くのurlFetchがあります。私の質問は、Futureが14しかないときに、urlFetchへのこのすべての呼び出しをどのように取得するのですか?サーバーがエラーを出しているのでしょうか、それとも503とurlFetchが通過するまで再試行しているのでしょうか。また、リクエストごとに2つの投稿を取得するにはどうすればよいですか?

タスクキューを使用してasycリクエストを実行できることは理解していますが、比較的少数のリクエスト(20-100)を処理しているため、別のインスタンスを立ち上げるコールドスタート時間により、これはおそらく私の適切なオプションではありません。状況。誰かがこの振る舞いを説明したり、これを経験したりできますか?

4

1 に答える 1

0

これは単にコードの間違いであり、アプリが思ったよりも多くのリクエストを行う原因になりました。

于 2012-12-27T01:56:28.387 に答える