0

我有一个非常简单的控制器,如下所示:

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

到目前为止,流程将是:Controller --> Service --> Repository

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

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

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

据我所知,Spring 中的 @Async 注解支持异步,而CallableDeferredResult做同样的事情,那我应该选择哪一个呢?

4

1 回答 1

1

@Async 与控制器中的 Future int 服务和 DeferedResult 结合使用。见http://spring.io/guides/gs/async-method/

您的 FoodService.findByNameMatching 必须返回 java8 CompetableFuture 或 Spring ListenableFuture 或只是 Future。并且您的控制器将返回 DeferedResult。

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

不要忘记使您的应用程序 AsyncEnabled。使用spring boot,您可以使用@EnableAsync。

那些你想异步工作的 API 应该根据上面的注释进行更改。

于 2016-03-08T18:27:55.650 回答