2016-03-08 17 views
0

我有一個非常簡單的控制器是這樣的:我應該把@Async上的每個服務方法,使我的應用程序完全支持異步的春天?

@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的支持asynchonous.In這種情況下,服務調用的信息庫查詢數據。我應該將@Async註釋放在FoodService的方法中,使查詢任務成爲異步嗎?

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

在擴展,我應該把@Async詮釋了我所有的服務的方法,使我的應用程序完全支持異步?

所以,據我所知,在春季@Async註解支持異步而可贖回DeferredResult做同樣的事情,所以這種情況下,我應該選擇哪一個?

回答

1

@Async須結合未來的詮釋,他的服務和DefferedResult控制器。見http://spring.io/guides/gs/async-method/

你FoodService.findByNameMatching必須返回java8 CompetableFuture或春季ListenableFuture或只是未來。你的控制器會返回DefferedResult。

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

不要忘記讓你的應用程序AsyncEnabled。使用spring引導,你可以使用@EnableAsync。

要異步工作這些API應根據上述意見進行更改。