使用Future的App引擎上的异步urlfetch Http帖子

时间:2012-04-19 21:12:08

标签: java google-app-engine asynchronous concurrency httprequest

我的目标是从appengine(java)快速发布服务器。我正在尝试使用UrlFetchService.fetchAsync执行此操作。我一直在this blog 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-20x urlFetches。以下是我的appstats屏幕:

Appstats screen shot

还有更多的urlFetch调用无法在屏幕上显示。似乎请求仍以同步方式完成(带圆圈的项目),但有许多urlFetches似乎同时进行。我的问题是,当我只有14个Future时,我是如何得到所有这些调用urlFetch的?服务器是否会发出错误或503和urlFetch重试,直到它通过?我怎样才能为每个请求获得2个帖子?

据我所知,我可以使用任务队列来执行asyc请求,但是我处理的请求数量相对较少(20-100),并且启动另一个实例的冷启动时间可能会使这不太好我的情况选项。任何人都可以解释这种行为或有这方面的经验吗?

1 个答案:

答案 0 :(得分:0)

这只是我的代码中的一个错误,导致我的应用程序提出的请求超出了我的想法..