я хочу получить ответ Async Fetch (Google App Engine) - PullRequest
0 голосов
/ 02 июля 2011

Я создаю веб-приложение на Google App Engine и использую AsyncURLFetch Api.

Но я не могу получить ответ. Пожалуйста, помогите мне ...

Searc.java

private ArrayList<Future<HTTPResponse>> fetchURL() {
    ArrayList<Future<HTTPResponse>> futureList = new ArrayList<Future<HTTPResponse>>();

    for (SearchResult searchResult : searchResultList) {
        if (!searchResult.isEmpty()) {
            for (WebPage webPage : searchResult.getWebPageArray()) {
                try {
                    URL url = new URL(
                            "http://myapi.appspot.com/htmlparser?url="
                                    + webPage.getPageURL());
                    URLFetchService us = URLFetchServiceFactory
                            .getURLFetchService();
                    futureList.add(us.fetchAsync(url));
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    return futureList;
}

private ArrayList<HTTPResponse> getFetchResult(
        ArrayList<Future<HTTPResponse>> futureList) {
    ArrayList<HTTPResponse> responseList = new ArrayList<HTTPResponse>();
    try {
        for (Future<HTTPResponse> future : futureList) {
            if (future.isDone()) {
                log.info("future calls get");
                HTTPResponse resp = future.get();
                responseList.add(resp);
            }
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
        log.info(e.getMessage());
    } catch (ExecutionException e) {
        e.printStackTrace();
        log.info(e.getMessage());
    }
    return responseList;
}

HTMLParser.java

public class HTMLParser extends HttpServlet{
protected static Logger log = LoggerFactory.getLogger(HTMLParser.class);

private PrintWriter writer;
private URL paramURL;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    // TODO Auto-generated method stub
    resp.setContentType("text/html; charset=utf8");
    writer = resp.getWriter();
    getParameter(req);
    viewTest();
}

private void getParameter(HttpServletRequest req){
    paramURL = getURL(req);
}

private URL getURL(HttpServletRequest req){
    try {
        URL url;
        url = new URL(req.getParameter("url"));
        return url;
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}


private void viewTest(){
    writer.println(paramURL);
    log.info(paramURL.toString());
}}

future.isDone () имеет значение «false»

Что я делаю, чтобы получить «правду»?

1 Ответ

0 голосов
/ 04 июля 2011

Вы читали документацию по Java Futures ? future.isDone() не будет блокировать и вернет False до тех пор, пока не завершится выполнение будущего. Чтобы получить результаты всех асинхронных вызовов, вы должны безоговорочно вызывать future.get() для каждого из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...