Подтвердить что ты не робот

Когда использовать Spring @Async vs Callable controller (асинхронный контроллер, сервлет 3)

Я хотел бы узнать общий прецедент использования асинхронного запроса @Async и Servlet 3 в Spring с помощью Callable.

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

@Async
void doSomething(String s) {
// this will be executed asynchronously
}

и любой контроллер, который возвращает Callable

  @RequestMapping("/view")
public Callable<String> callableWithView(final Model model) {
    return new Callable<String>() {
        @Override
        public String call() throws Exception {
            Thread.sleep(2000);
            model.addAttribute("foo", "bar");
            model.addAttribute("fruit", "apple");
            return "views/html";
        }
    };
}

Я смущен, когда использовать что. Каким будет эффект использования асинхронного сервлета/контроллера и Spring @Async вместе?

4b9b3361

Ответ 1

В этой статье есть объяснение того, что вы ищете

Выдержки:

В некоторых случаях вы можете немедленно вернуться к клиенту, пока фоновая работа завершает обработку. Например, отправив электронное письмо, начиная работу с базой данных, а другие представляют собой огонь и забыть сценарии, которые могут обрабатываться с помощью Spring @Async или размещение события на канале интеграции Spring, а затем возврат идентификатор подтверждения, который клиент может использовать для запроса результатов.

Обратный тип возвращаемого значения делает метод контроллера асинхронным. Обычно это используется в ситуациях, таких как длительный опрос. Прочтите эту статью того же автора за дополнительной информацией.

Также вызываемый является альтернативой Runnable, в том смысле, что он может возвращать результаты и выдавать проверенные исключения.

Скажите, что у вас есть метод

public String aMethod(){

}

Это можно сделать асинхронным, просто вернув интерфейс Callable.

public Callable<String>  aMethod(){

}

Ответ 2

вы не можете улучшить производительность одного запроса с помощью интерфейса Callable, в некоторых случаях он может потребовать больше запросов. Если ваш тип ответа будет недействительным, вы можете использовать runnable вместо callable, поэтому с помощью runnable вы можете улучшить время отклика одного запроса.