Вернуть результат метода @Async в Spring MVC и вернуть его клиенту Ajax - PullRequest
6 голосов
/ 26 октября 2011

У меня есть какой-то метод внутри моего контроллера, который выполняет @Async задачу

@Async
public Future<String> getResultFromServer(){
    String result = ......
    return new AsyncResult<String>(result);
} 

Время выполнения метода до 10 минут. Все, что мне нужно сделать, это просто вернуть результат на клиентскую сторону, которая будет подключена с помощью AJAX / JQuery.

Я не хочу, чтобы клиент запрашивал у моего сервера каждую секунду, выполняется метод @Async или нет. Я просто хочу, чтобы мое соединение было открыто, а затем просто "отправить" результат на сервер.

@RequestMapping(value="/async.do", method=RequestMethod.POST)
public void getResult(HttpServletResponse res){
    String result = null;
    PrintWriter out = res.getWriter();
    Future<String> future = getResultFromServer();
    try {
        if (future.isDone())
            result = future.get();
        out.println(result);
        out.close();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
}

Я понимаю, что это очень близко к модели Comit, но я не знаком с кометой вообще.

У меня вопрос: как я могу держать соединение открытым на стороне клиента, используя JavaScript / JQuery?

и мой метод @RequestMapping(value="/async.do", method=RequestMethod.POST) передаст результат клиенту?

1 Ответ

3 голосов
/ 27 октября 2011

Самый простой способ - не вызывать метод асинхронным способом, а вместо этого вызывать его напрямую из контроллера синхронным способом.

Тогда запрос должен будет «ждать», пока результат метода не будетрассчитывается, и его можно вернуть, как только он будет создан.

Конечно, это означает, что соединение будет открыто в течение времени, необходимого для выполнения работы (1 минута).

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