java的rest异步调用_使用AsyncRestTemplate进行异步调用
背景:
最近项目中需要并发调用c++服务的http接口,问题是同时调用两个接口时,会发生严重阻塞,导致页面响应慢,还经常遇到接收数据超时,导致RestTemplate报出ReadTimeout错误,一味地增加ReadTimeout时间解决不了根本问题。
原使用的方案:
前一个版本中使用的是Feign,虽然响应速度方面还可以,但是唯一不足是,返回的数据只能以String接收,在每一个方法中进行String转换成java对象的方法。
我是一个比较懒的程序员,不想写很多无用的重复代码。所以在这次版本中决定使用RestTemplate,封装一个RestClient工具类,所有调用第三方接口都通过该工具类提供的方法调用,返回的ResponseEntity通过指定的Class类型进行转换并返回。
解决方案:
使用AsyncRestTemplate异步调用接口,无阻塞进行请求。下面直接贴代码。
一、AsyncRestTemplate注册为Bean,使Spring容器对其进行管理。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.AsyncRestTemplate;
@Configuration
public class RestTemplateConfiguration {
@Bean
public AsyncRestTemplate asyncRestTemplate() {
return new AsyncRestTemplate();
}
}
此次采用的是AsyncRestTemplate默认的构造方法。会默认使用SimpleAsyncTaskExecutor。
二、编写测试Controller类
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
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.RestController;
import org.springframework.web.client.AsyncRestTemplate;
@RestController
public class WebController {
@Autowired
private AsyncRestTemplate asyncRestTemplate;
@RequestMapping("/demo")
public String demo() {
try {
Thread.sleep(30000);
} catch (Exception e) {
e.printStackTrace();
}
return new Date()+"--->>>30秒。。。。";
}
@RequestMapping("/async")
public String async() {
String url = "http://127.0.0.1:8080/demo";
//调用完后立即返回(没有阻塞)
ListenableFuture> forEntity = asyncRestTemplate.getForEntity(url, String.class);
//异步调用后的回调函数
forEntity.addCallback(new ListenableFutureCallback>() {
//调用失败
@Override
public void onFailure(Throwable ex) {
System.err.println("=====rest response faliure======");
}
//调用成功
@Override
public void onSuccess(ResponseEntity result) {
System.out.println("--->async rest response success----, result = "+result.getBody());
}
});
return new Date()+"--->>>异步调用结束";
}
}
三、调用async接口
16:15:20先返回异步调用结束
而调用的方法时16:15:50,即休眠30秒后返回的。
仅供参考,后期对AsyncRestTemplate有更深入的了解继续更新。。。
java的rest异步调用_使用AsyncRestTemplate进行异步调用相关推荐
- java同步异步区别_同步请求和异步请求的区别
同步请求和异步请求的区别 先解释一下同步和异步的概念 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式. 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的 ...
- java同步接口和异步接口_同步接口和异步接口
定义 答案:来自网络搜索 同步调用:当一个支付请求被发送到支付渠道方,支付渠道会很快返回一个结果.但是这个结果,只是告诉你调用成功了,不是扣款成功,这叫同步调用; 异步调用:同步请求参数里面会有一个回 ...
- 深入理解python异步编程_深入理解Python异步编程
1 什么是异步编程 1.1 阻塞程序未得到所需计算资源时被挂起的状态. 程序在等待某个操作完成期间,自身无法继续干别的事情,则称该程序在该操作上是阻塞的. 常见的阻塞形式有:网络I/O阻塞.磁盘I/O ...
- java excel异步导出_如何实现前端异步调用导出Excel?
今天分享JBolt极速开发平台中使用的异步下载文件的解决方案. 需求场景: 列表查询界面有一个[导出Excel]按钮,需要点击按钮,弹出loading信息框,异步调用后台action,得到数据库数据后 ...
- java 数据源调用_实战分享: Spring boot 调用之间实现动态数据源
需求: 根据项目部署在不同的域名,在同一套系统下,分别访问不同的数据库 (当然在看别人帖子的时候,也发现了不同接口访问不同数据源问题,就是分库动态数据源需求了,其实实现都一样) 业务描述: 部署的时候 ...
- java 获取 海康 视频流_海康网络摄像机调用SDK解码Java版
两个回调函数: FRealDataCallBack 实现预览回调数据 DecCallBack 解码回调函数 在HCNetSDK.java补充相关函数和结构声明 //播放库函数声明,PlayCtrl.d ...
- java 微信开发收到乱码_微信公众号开发调用微信接口得到的参数中文变成乱码问题...
做过微信开发的人应该都会接触到授权登录.获取用户信息等操作,比如获取用户信息,腾讯要求以get请求提交,返回的是json字符串. 通常我们使用的方法是用HttpURLConnection去调用接口,打 ...
- JAVA实现Excel照相机功能_教大家如何设置调用Excel照相机功能
近日有关于如何设置调用Excel照相机功能的问题受到了很多网友们的关注,大多数网友都想要知道如何设置调用Excel照相机功能的具体情况,那么关于到如何设置调用Excel照相机功能的相关信息,小编也是在 ...
- java 内部类 静态方法调用_内部类和静态内部类的调用
package day6$6; public class Inside { public static void main(String[] args) { //先创建一个外部类对象 Outside ...
最新文章
- 如何让机器像人一样多角度思考?协同训练来帮你
- springAop源码分析
- [密码学] DES(二)
- 关于C# Winform DataGridView 设置DefaultCellStyle无效的原因与解决方案
- 浅析 Dapr 里的云计算设计模式
- BROCADE 300和MD3200扩展柜FC SAN,截图
- 奔着政府补贴:野蛮生长的机器人产业或跳进去一家死一家
- 读宗成庆老师著统计自然语言处理书笔记整理(1)
- java sao_JavaScript 的一些SAO操作
- win10不能安装破解软件:提示系统资源不足,无法完成请求服务的解决方法
- 移动硬盘无法在Mac上装载如何修复?
- mysql的数据库实例名是啥_数据库名、数据库实例名与数据库域名
- matlab信号探测,雷达信号检测matlab程序
- 数电课设交通灯控制器
- 一维码(条形码)二维码三维码基本原理
- 称重传感器(体脂体重模块)应用及特点
- 【CTR预估】criteo数据集预处理shell命令
- 手把手教学--Python爬取有道词典
- 秒速五厘米(为情怀而补的题)
- 深度残差收缩网络(Deep Residual Shrinkage Networks for Fault Diagnosis )