Где разместить Spring @Async в стеке вызовов методов

Я использую 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 не я, а необходимость.

riccardo.cardin 12.03.2018 18:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
702
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Аннотирование метода с помощью @Async приведет к немедленному возврату вызывающего объекта, и фактическое выполнение будет происходить в отдельном потоке как часть задачи, отправленной на SimpleAsyncTaskExecutor по умолчанию (если вы не настроили другой). См. Соответствующую пружину документация.

При этом для вашей цели нет никакой дополнительной пользы от вложения @Async. Если ваша цель - сделать Repository.findSomething асинхронным и иметь возможность вызывать его из разных мест, а не только из Service.findSomething, вы должны аннотировать только этот метод.

Кроме того, Service.findSomething сам по себе является асинхронным, даже если он не аннотирован @Async, в описанном вами сценарии. Метод не блокируется вызовом CompletableFuture.get(), и он немедленно вернется, хотя он не будет выполняться в отдельном потоке.

Другие вопросы по теме