私の目標は、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画面です:
画面に収まらないurlFetch呼び出しが他にもあります。リクエストはまだ同期して完了しているようです(丸で囲んだ項目)が、同時に進行しているように見える多くのurlFetchがあります。私の質問は、Futureが14しかないときに、urlFetchへのこのすべての呼び出しをどのように取得するのですか?サーバーがエラーを出しているのでしょうか、それとも503とurlFetchが通過するまで再試行しているのでしょうか。また、リクエストごとに2つの投稿を取得するにはどうすればよいですか?
タスクキューを使用してasycリクエストを実行できることは理解していますが、比較的少数のリクエスト(20-100)を処理しているため、別のインスタンスを立ち上げるコールドスタート時間により、これはおそらく私の適切なオプションではありません。状況。誰かがこの振る舞いを説明したり、これを経験したりできますか?