Я использую Spring Boot 1.5.x, а в деталях я использую аннотацию @Async. Моя проблема в том, что у меня в репозитории есть следующий метод.
@Repository
class Repository {
@Async
CompletableFuture<String> findSomething() {
/* Some code that returns something */
}
}
Затем у меня есть следующий метод в службе, который вызывает указанный выше репозиторий.
@Service
class Service {
private Repository repository;
// ...
@Async
CompletableFuture<String> findSomething() {
return repository.findSomething()
}
}
У меня вопрос: следует ли размещать аннотацию @Asyncтакже в методе service.findSomething()? Или я должен разместить аннотацию Только в методе обслуживания?
Я имею в виду, что Spring должен запланировать выполнение метода, отмеченного аннотацией @Async, в выделенном потоке. Это правильно?
Заранее спасибо.




Аннотирование метода с помощью @Async приведет к немедленному возврату вызывающего объекта, и фактическое выполнение будет происходить в отдельном потоке как часть задачи, отправленной на SimpleAsyncTaskExecutor по умолчанию (если вы не настроили другой). См. Соответствующую пружину документация.
При этом для вашей цели нет никакой дополнительной пользы от вложения @Async. Если ваша цель - сделать Repository.findSomething асинхронным и иметь возможность вызывать его из разных мест, а не только из Service.findSomething, вы должны аннотировать только этот метод.
Кроме того, Service.findSomething сам по себе является асинхронным, даже если он не аннотирован @Async, в описанном вами сценарии. Метод не блокируется вызовом CompletableFuture.get(), и он немедленно вернется, хотя он не будет выполняться в отдельном потоке.
Ну, это драйвер, который я использую для подключения к базе данных, использующей асинхронную модель. Так что использовать @Async не я, а необходимость.