背景:

最近项目中需要并发调用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进行异步调用相关推荐

  1. java同步异步区别_同步请求和异步请求的区别

    同步请求和异步请求的区别 先解释一下同步和异步的概念 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式. 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的 ...

  2. java同步接口和异步接口_同步接口和异步接口

    定义 答案:来自网络搜索 同步调用:当一个支付请求被发送到支付渠道方,支付渠道会很快返回一个结果.但是这个结果,只是告诉你调用成功了,不是扣款成功,这叫同步调用; 异步调用:同步请求参数里面会有一个回 ...

  3. 深入理解python异步编程_深入理解Python异步编程

    1 什么是异步编程 1.1 阻塞程序未得到所需计算资源时被挂起的状态. 程序在等待某个操作完成期间,自身无法继续干别的事情,则称该程序在该操作上是阻塞的. 常见的阻塞形式有:网络I/O阻塞.磁盘I/O ...

  4. java excel异步导出_如何实现前端异步调用导出Excel?

    今天分享JBolt极速开发平台中使用的异步下载文件的解决方案. 需求场景: 列表查询界面有一个[导出Excel]按钮,需要点击按钮,弹出loading信息框,异步调用后台action,得到数据库数据后 ...

  5. java 数据源调用_实战分享: Spring boot 调用之间实现动态数据源

    需求: 根据项目部署在不同的域名,在同一套系统下,分别访问不同的数据库 (当然在看别人帖子的时候,也发现了不同接口访问不同数据源问题,就是分库动态数据源需求了,其实实现都一样) 业务描述: 部署的时候 ...

  6. java 获取 海康 视频流_海康网络摄像机调用SDK解码Java版

    两个回调函数: FRealDataCallBack 实现预览回调数据 DecCallBack 解码回调函数 在HCNetSDK.java补充相关函数和结构声明 //播放库函数声明,PlayCtrl.d ...

  7. java 微信开发收到乱码_微信公众号开发调用微信接口得到的参数中文变成乱码问题...

    做过微信开发的人应该都会接触到授权登录.获取用户信息等操作,比如获取用户信息,腾讯要求以get请求提交,返回的是json字符串. 通常我们使用的方法是用HttpURLConnection去调用接口,打 ...

  8. JAVA实现Excel照相机功能_​教大家如何设置调用Excel照相机功能

    近日有关于如何设置调用Excel照相机功能的问题受到了很多网友们的关注,大多数网友都想要知道如何设置调用Excel照相机功能的具体情况,那么关于到如何设置调用Excel照相机功能的相关信息,小编也是在 ...

  9. java 内部类 静态方法调用_内部类和静态内部类的调用

    package day6$6; public class Inside { public static void main(String[] args) { //先创建一个外部类对象 Outside ...

最新文章

  1. 如何让机器像人一样多角度思考?协同训练来帮你
  2. springAop源码分析
  3. [密码学] DES(二)
  4. 关于C# Winform DataGridView 设置DefaultCellStyle无效的原因与解决方案
  5. 浅析 Dapr 里的云计算设计模式
  6. BROCADE 300和MD3200扩展柜FC SAN,截图
  7. 奔着政府补贴:野蛮生长的机器人产业或跳进去一家死一家
  8. 读宗成庆老师著统计自然语言处理书笔记整理(1)
  9. java sao_JavaScript 的一些SAO操作
  10. win10不能安装破解软件:提示系统资源不足,无法完成请求服务的解决方法
  11. 移动硬盘无法在Mac上装载如何修复?
  12. mysql的数据库实例名是啥_数据库名、数据库实例名与数据库域名
  13. matlab信号探测,雷达信号检测matlab程序
  14. 数电课设交通灯控制器
  15. 一维码(条形码)二维码三维码基本原理
  16. 称重传感器(体脂体重模块)应用及特点
  17. 【CTR预估】criteo数据集预处理shell命令
  18. 手把手教学--Python爬取有道词典
  19. 秒速五厘米(为情怀而补的题)
  20. 深度残差收缩网络(Deep Residual Shrinkage Networks for Fault Diagnosis )

热门文章

  1. AIGC - Stable Diffusion 学习踩坑实录总结
  2. spring @value注解
  3. IOS切图直接作为Android切图使用
  4. arduino和单片机的区别,arduino好还是单片机好?
  5. 【AI in 美团】深度学习在OCR中的应用
  6. 大连理工大学软件学院编译技术课程——MicroC词法分析上机实验
  7. 大连理工大学软件学院数据结构第四章第九题
  8. 聘用计算机人员申请书范文,岗位聘用的申请书格式范文精选(2)
  9. java各类英文的意思,附源代码
  10. MATLAB实现TCP/IP通信