簡體   English   中英

使用Future在App引擎上異步urlfetch Http發布

[英]Async urlfetch Http post on App engine using Future

我的目標是從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屏幕:

Appstats屏幕截圖

屏幕上無法容納更多的urlFetch調用。 似乎請求仍以同步方式完成(圈出的項目),但是似乎同時進行了許多urlFetches。 我的問題是,當我只有14個Future時,如何將所有這些調用傳遞給urlFetch? 服務器是否會給出錯誤消息或503和urlFetch重試直到通過? 我如何為每個請求獲得2個帖子?

我知道可以使用任務隊列執行asyc請求,但是我處理的請求數量相對較少(20-100),啟動另一個實例的冷啟動時間可能對我來說不是一個好選擇情況。 任何人都可以解釋這種行為或對此有經驗嗎?

這僅僅是我的代碼中的一個錯誤,導致我的應用程序發出了比我想象的更多的請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM