使用AsyncRestTemplate物件進行非同步請求呼叫
阿新 • • 發佈:2018-12-14
最近在公司寫了個專案,需要優化下業務邏輯層。由於第三方需要短時間大量呼叫第三方API,那麼之前的同步呼叫就會特別慢,而且這種等待是不方便使用者的、對使用者不友好的。你設想下同時附近1000個司機、1000個乘客同時釋出行程。同步呼叫的方法,必須等待一個request請求高德得到返回值後才會執行下一個request,響應時間就會特別慢。
AsyncRestTemplate是在Spring4.0中對RestTemplate進行擴充套件產生的新類,其為客戶端提供了非同步http請求處理的一種機制,通過返回ListenableFuture物件生成回撥機制,以達到非同步非阻塞傳送http請求。
下面直接給程式碼:(休眠5s是模擬第三方)
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 "非同步呼叫結束"; } }
下篇博文會給大家分享下用Springboot3.0開始的@Async註解。這個註解支援Service的方法變成非同步處理。特別方便
此外,不足之處還請大家指正!
轉載於:https://blog.csdn.net/qq_38622452/article/details/81874483