Время выполнения контроллера / метода в Spring - PullRequest
10 голосов
/ 05 октября 2011

У меня есть контроллер Spring, к которому в данный момент обращаются нормально, но я хочу изменить реализацию таким образом, чтобы, если задача, выполняемая контроллером, занимала более определенное время, например, 10 секунд, контроллер мог ответить «ваш запрос обрабатывается сообщением» для вызывающей стороны, но если метод возвращается в течение времени, то ответ передается вызывающему методу от контроллера, другими словами, я хочу синхронизированное асинхронное выполнение от контроллера Spring.

NB. Это не совсем домен TaskExecutor (по крайней мере, насколько я понимаю), потому что я не хочу просто передавать выполнение TaskExecutor и немедленно возвращаться.

Я использую Spring 3.0 и Java 1.5, и у контроллеров нет представлений, я просто хочу записать вывод прямо в поток, что ожидает вызывающий клиент.

1 Ответ

6 голосов
/ 05 октября 2011

Ну, это это домен TaskExecutor. В вашем контроллере просто оберните вашу логику обработки в Callable, отправьте ее в AsyncTaskExecutor и подождите до 10 секунд. Вот и все!

final Future<ModelAndView> future = asyncTaskExecutor.submit(new Callable<ModelAndView>() {
    @Override
    public ModelAndView call() throws Exception {
        //lengthy computations...
        return new ModelAndView("done");
    }
});
try {
    return future.get(10, TimeUnit.SECONDS);
} catch (TimeoutException e) {
    return new ModelAndView("timeout");
}

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

Дальнейшее чтение:

...