我的目标是从 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 页面,我使用的 urlFetches 比上面代码添加的多 10 到 20 倍。下面是我的 appstats 屏幕:
还有更多 urlFetch 调用无法显示在屏幕上。看起来请求仍在以同步方式完成(带圆圈的项目),但似乎有许多 urlFetches 似乎同时进行。我的问题是,当我只有 14 个 Future 时,我如何获得对 urlFetch 的所有这些调用?服务器是否会给出错误或 503 和 urlFetch 重试直到它通过?我怎样才能为每个请求获得 2 个帖子?
我知道我可以使用任务队列来执行异步请求,但是我处理的请求数量相对较少(20-100),并且启动另一个实例的冷启动时间可能会使这对我来说不是一个好选择情况。任何人都可以解释这种行为或对此有经验吗?