我有一个非常简单的控制器:
@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 执行相同的操作,所以我应该选择哪一个?
答案 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应根据上述注释进行更改。