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

У меня есть очень простой контроллер:

    @RequestMapping(value = "food", method = RequestMethod.POST)
    public ResponseEntity<?> getAll(@RequestParam("term") String term) {

        List<Food> foods = foodService.findByNameMatching(term);

        return new ResponseEntity<>(foods, HttpStatus.OK);
    }

И обслуживание:

@Service
@Transactional
public class FoodService {

    @Autowired
    private FoodRepository foodRepository;


    public List<Food> findByNameMatching(String name) {
        return foodRepository.findMatchName(name);
    }
}

FoodRepository — это не что иное, как JpaRepository.

Пока поток будет таким: Контроллер --> Сервис --> Репозиторий.

На данный момент я хочу, чтобы все мои Rest API поддерживали асинхронность. В этом случае служба вызывает репозиторий для запроса данных. Должен ли я поместить аннотацию @Async в метод FoodService, чтобы сделать задачу запроса асинхронной?

@Async
public List<Food> findByNameMatching(String name) {
         return foodRepository.findMatchName(name);
}

Кроме того, должен ли я помещать аннотацию @Async во все методы моей службы, чтобы мое приложение полностью поддерживало асинхронность?

Насколько мне известно, аннотация @Async в Spring поддерживает асинхронность, в то время как Callable и DeferredResult делают одно и то же, так что какой вариант выбрать?


person xtiger    schedule 08.03.2016    source источник


Ответы (1)


@Async работает в сочетании с Future в службе и DefferedResult в контроллере. См. http://spring.io/guides/gs/async-method/.

Ваш FoodService.findByNameMatching должен возвращать java8 CompetableFuture или Spring ListenableFuture или просто Future. И ваш контроллер вернет DefferedResult.

@Async
public CompletableFuture<List<Food>> findByNameMatching(String name) {
         return CompletableFuture.completedFuture(foodRepository.findMatchName(name));
}    

Не забудьте сделать приложение AsyncEnabled. С весенней загрузкой вы можете использовать @EnableAsync.

Те API, которые вы хотите работать асинхронно, должны быть изменены в соответствии с приведенными выше комментариями.

person Dennis R    schedule 08.03.2016