我应该在每个服务方法上放置@Async以使我的应用程序在Spring中完全支持异步吗?

时间:2016-03-08 17:59:57

标签: java spring asynchronous completable-future

我有一个非常简单的控制器:

    @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。

到目前为止,流程将是:控制器 - &gt;服务 - &gt;存储库

目前,我希望我的所有Rest API都支持asynchonous。在这种情况下,服务调用存储库来查询数据。我应该将@Async注释放到FoodService的方法中,以使查询任务变得异步吗?。

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

在扩展中,我应该使用 @Async 注释我的所有服务方法来使我的应用程序完全支持异步吗?

据我所知,Spring中的@Async注释支持异步,而 Callable DeferredResult 执行相同的操作,所以我应该选择哪一个?

1 个答案:

答案 0 :(得分:1)

@Async与Future int服务和控制器中的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。使用spring boot,您可以使用@EnableAsync。

您希望异步工作的API应根据上述注释进行更改。