我的目標是從appengine(java)快速地發佈到服務器。我正在嘗試使用UrlFetchService.fetchAsync來做到這一點。我一直在this blog post之後立足我的代碼。我已經能夠使用下面的代碼發出請求,但是我得到一些奇怪的行爲:異步urlfetch使用未來的App引擎上的Http post
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頁我用10x-比上面的代碼增加了20倍以上的urlFetches。下面是我將Appstats屏幕:
還有更多的URLFetch電話,可能不適合在屏幕上。看起來這些請求仍然以同步的方式完成(圓圈項目),但有很多urlFetches同時出現。我的問題是,當我只有14個未來時,我如何獲得所有對urlFetch的調用?服務器是否會給出錯誤或503和urlFetch重試,直到它通過?我怎麼能得到每個請求2個職位?
據我所知,我可以使用任務隊列來做asyc請求,但是我正在處理相對較少的請求數(20-100),而增加另一個實例的冷啓動時間可能會使得這不是一個我的情況很好的選擇。任何人都可以解釋這種行爲或有這方面的經驗?
那麼,顯而易見的答案是,你正在做更多的網址擷取比你想象的。你記錄了你在某處創建的期貨數量嗎?你看過每個RPC的蹤跡,看看它來自哪裏?而且,它們不是同步的 - 只有同時執行多少個未完成請求的限制。 – 2012-04-20 00:27:05
你是否得到重定向?那些是默認的。 IMO唯一的解釋是你有一個重定向循環。 – 2012-04-20 06:11:12
@NickJohnson看起來很明顯的答案是正確的。我確實比我想象的要求多得多。一個錯位的大括號導致futureRequest()被稱爲循環內部而不是外部...簡單的校正,現在它像冠軍一樣工作,並大大減少了完成該過程所需的時間。謝謝。 – Patrick 2012-04-20 15:34:33