使用Spring AsyncRestTemplate對象進行異步請求調用
直接上代碼:
package com.mlxs.common.server.asyncrest; import org.apache.log4j.Logger; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.util.concurrent.ListenableFuture; import org.springframework.util.concurrent.ListenableFutureCallback; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.client.AsyncRestTemplate; import org.springframework.web.client.RestTemplate; /** * Asyncrest: AsyncRestTemplate 異步發生請求測試 * * @author mlxs * @since 2016/8/4 */ @Controller @RequestMapping("/async") public class AsyncrestController { Logger logger = Logger.getLogger(AsyncrestController.class); @RequestMapping("/fivetime") @ResponseBody public String tenTime(){ try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } return "5秒..."; } /** * 同步調用 * @return */ @RequestMapping("/sync") @ResponseBody public String sync(){ //同步調用 RestTemplate template = new RestTemplate(); String url = "http://localhost:8080/async/fivetime";//休眠5秒的服務 String forObject = template.getForObject(url, String.class); return "同步調用結束, 結果:" + forObject; } /** * 異步調用 * @return */ @RequestMapping("/async") @ResponseBody public String async(){ AsyncRestTemplate template = new AsyncRestTemplate(); String url = "http://localhost:8080/async/fivetime";//休眠5秒的服務 //調用完後立即返回(沒有阻塞) ListenableFuture<ResponseEntity<String>> forEntity = template.getForEntity(url, String.class); //異步調用後的回調函數 forEntity.addCallback(new ListenableFutureCallback<ResponseEntity<String>>() { //調用失敗 @Override public void onFailure(Throwable ex) { logger.error("=====rest response faliure======"); } //調用成功 @Override public void onSuccess(ResponseEntity<String> result) { logger.info("--->async rest response success----, result = "+result.getBody()); } }); return "異步調用結束"; } }
同步請求:
異步請求: