Spring4新特性:

使用AsyncRestTemplate进行异步调用 背景:     最近项目中需要并发调用c++服务的http接口,问题是同时调用两个接口时,会发生严重阻塞,导致页面响应慢,还经常遇到接收数据超时,导致RestTemplate报出ReadTimeout错误,一味地增加ReadTimeout时间解决不了根本问题。 原使用的方案:     前一个版本中使用的是Feign,虽然响应速度方面还可以,但是唯一不足是,返回的数据只能以String接收,在... 阅读详情

从Spring4开始,Spring以Servlet3为进行开发,如果用Spring MVC 测试框架的话需要指定Servlet3兼容的jar包(因为其Mock的对象都是基于Servlet3的)。另外为了方便Rest开发,通过新的@RestController指定在控制器上,这样就不需要在每个@RequestMapping方法上加 @ResponseBody了。而且添加了一个AsyncRestTemplate ,支持REST客户端的异步无阻塞支持。

 

1、@RestController

  1. @RestController  
  2. public class UserController {  
  3.     private UserService userService;  
  4.     @Autowired  
  5.     public UserController(UserService userService) {  
  6.         this.userService = userService;  
  7.     }  
  8.     @RequestMapping("/test")  
  9.       public User view() {  
  10.         User user = new User();  
  11.         user.setId(1L);  
  12.         user.setName("haha");  
  13.         return user;  
  14.     }  
  15.   
  16.     @RequestMapping("/test2")  
  17.     public String view2() {  
  18.         return "{\"id\" : 1}";  
  19.     }  
  20. }  
其实现就是在@@RestController中加入@ResponseBody:

  1. @org.springframework.stereotype.Controller  
  2. @org.springframework.web.bind.annotation.ResponseBody  
  3. public @interface RestController {  
  4. } 

这样当你开发Rest服务器端的时候,spring-mvc配置文件需要的代码极少,可能就仅需如下一行:

  1. <context:component-scan base-package="com.sishuok.spring4"/>  
  2. <mvc:annotation-driven/>  

2、mvc:annotation-driven配置变化

统一风格;将 enableMatrixVariables改为enable-matrix-variables属性;将ignoreDefaultModelOnRedirect改为ignore-default-model-on-redirect。

 

3、提供AsyncRestTemplate用于客户端非阻塞异步支持。

3.1、服务器端

对于服务器端的springmvc开发可以参考https://github.com/zhangkaitao/servlet3-showcase中的chapter3-springmvc

  1. @RestController  
  2. public class UserController {  
  3.     private UserService userService;  
  4.     @Autowired  
  5.     public UserController(UserService userService) {  
  6.         this.userService = userService;  
  7.     }  
  8.     @RequestMapping("/api")  
  9.       public Callable<User> api() {  
  10.         System.out.println("=====hello");  
  11.         return new Callable<User>() {  
  12.             @Override  
  13.             public User call() throws Exception {  
  14.                 Thread.sleep(10L * 1000); //暂停两秒  
  15.                 User user = new User();  
  16.                 user.setId(1L);  
  17.                 user.setName("haha");  
  18.                 return user;  
  19.             }  
  20.         };  
  21.     }  
  22. }  

非常简单,服务器端暂停10秒再返回结果(但是服务器也是非阻塞的)。具体参考我github上的代码。

 

3.2、客户端

  1. public static void main(String[] args) {  
  2.     AsyncRestTemplate template = new AsyncRestTemplate();  
  3.     //调用完后立即返回(没有阻塞)  
  4.     ListenableFuture<ResponseEntity<User>> future = template.getForEntity("http://localhost:9080/spring4/api", User.class);  
  5.     //设置异步回调  
  6.     future.addCallback(new ListenableFutureCallback<ResponseEntity<User>>() {  
  7.         @Override  
  8.         public void onSuccess(ResponseEntity<User> result) {  
  9.             System.out.println("======client get result : " + result.getBody());  
  10.         }  
  11.   
  12.         @Override  
  13.         public void onFailure(Throwable t) {  
  14.             System.out.println("======client failure : " + t);  
  15.         }  
  16.     });  
  17.     System.out.println("==no wait");  
  18. }  

此处使用Future来完成非阻塞,这样的话我们也需要给它一个回调接口来拿结果; Future和Callable是一对,一个消费结果,一个产生结果。调用完模板后会立即返回,不会阻塞;有结果时会调用其回调。

 

AsyncRestTemplate默认使用SimpleClientHttpRequestFactory,即通过java.net.HttpURLConnection实现;另外我们也可以使用apache的http components;使用template.setAsyncRequestFactory(new HttpComponentsAsyncClientHttpRequestFactory());设置即可。


此处使用Future来完成非阻塞,这样的话我们也需要给它一个回调接口来拿结果; Future和Callable是一对,一个消费结果,一个产生结果。调用完模板后会立即返回,不会阻塞;有结果时会调用其回调。

 

AsyncRestTemplate默认使用SimpleClientHttpRequestFactory,即通过java.net.HttpURLConnection实现;另外我们也可以使用apache的http components;使用template.setAsyncRequestFactory(new HttpComponentsAsyncClientHttpRequestFactory());设置即可。


Spring Boot 4 与 Spring Framework 7 全面解析:新特性、升级要点与实战指南 有了 API 版本控制和弹性注解,应用既能轻松升级,又能扛住各种异常靠 JSpecify 的空安全和 Kotlin 支持,运行时出错能少很多。声明式 HTTP 客户端,服务之间调用不用写一堆请求代码了。原生镜像支持和可观测性工具加强,往云环境上部署更顺了。跟所有大版本升级一样,关键是早点拿项目测。尤其是依赖升级和旧 API 替换这两块,早发现问题早解决。不过话说回来,升级后开发效率变高、性能变好、维护也省心,这点麻烦还是值得的。个人博客和同名公众号。 阅读详情

相关推荐

Spring Boot 4.0.0 新特性详解:深入解读 Spring Framework 7.0.0

API 版本控制:通过实现优雅的端点版本管理:支持灵活的编程式 Bean 注册空值安全:采用 JSpecify 注解构建更健壮的代码HTTP 代理:使用简化服务集成技术栈现代化:全面支持 Jackson 3.x、Servlet 6.1、WebSocket 2.2 和 GraalVM 原生镜像Spring Boot 3.4中文文档Spring Boot 3.5中文文档Spring AI 1.0.0中文文档这些变化让 Spring Boot 4.0.0 成为构建现代云原生应用的强大选择。

程序猿DD 2116

Spring 的异步HTTP请求AsyncRestTemplate

如果你是第一次看到这篇文章,那么我建议你先去看一下上一篇《Spring 的异步HTTP请求AsyncRestTemplate》 还是那个套路 熟悉使用RestTemplate的,不会觉得AsyncRestTemplate很难,因为的确很相似。在Spring 看来,你只管写同步的代码,异步的执行交给它处理就可以了。 配置依旧在 默认的有时难以满足多变的需求,于是配置自定义参数排上用场: @Be...

随-记的专栏 1万+

1. Klipper从安装到运行

本文记录Klipper固件从安装,配置到运行的详细过程

weixin_42098934的博客 1万+

AsyncRestTemplate异步调用远程Http服务开发

看这篇文章之前,建议你先去看一下我写的上一篇《RestTemplate调用远程Http服务开发》 一、背景介绍 我们在开发过程中有时候会遇到这样的开发场景:如果调用请求响应比较慢,甚至请求超时,程序就必须等到请求返回以后才能继续执行。然而在某些场合下,我并不需要等待请求的结果,或者我并不关心请求是否执行成功,只需要帮我继续执行之后的逻辑即可,减少响应时间,此时就需要通过异步处理。 在 Spring 3 时代,为了能更优雅地实现HTTP调用,引入了 RestTemplate,其中提供了多种便捷访问远程Http

QT2016 2110

动态数据脱敏技术分析

在当前国内信息安全热潮中,数据脱敏作为数据安全的重要一环得到了业界的认可与重视。早在2012年,数据脱敏首次作为一个单独的魔力象限由Gartner发布,Gartner在2014年又提出了:按照数据使用场景,将数据脱敏分为静态数据脱敏(Static data masking-SDM )与动态数据脱敏(Dynamic data masking-DDM )。 可能有人望文生义,认为动态数据脱敏一定比静态数据脱敏高级。非也非也,静态or动态,取决于脱敏的使用场景,主要是以使用场景为由来选择合适的数据脱敏的模式。 本

美创科技的博客 4667

android+音乐节拍检测,科学网—音乐节拍跟踪或音乐节拍检测软件,LilyBeats alpha - 石自强的博文...

我们设计并实现了一种用于实时跟踪音乐节拍的软件。该软件可以用于智能灯方案提供商,为其提供灯光随音乐变化的核心解决方案。首先给出软件的下载链接:或者音乐节拍是乐曲中表示固定单位时值和强弱规律的组织形式,亦称拍子。它有两个特性:周期性和连续性。节拍周期性表现为节拍结构,是乐曲中周期性出现的节奏序列。节拍连续性表现为音乐的平均速度,其单位为bpm(beat per minute每分钟音乐节拍的个数)。音...

weixin_39571403的博客 1400

坑:异步调用其他服务避免使用AsyncRestTemplate

现象 订单服务的几个流程推动接口,出现了大量异常。持续20分钟。 排查 初步查看日志,发现这段时间有大量异常抛出,全部都是 java.lang.IllegalStateException: No instances available for travel-push。如图: 比较奇怪的是push全都是异步调用的。按理说不能影响到主流程才对。 查代码发现,用的异步调用,是用的org.springframework.web.client.AsyncRest......

Carson073的博客 2875

用Arduino和FS-i6X遥控器,从零开始打造你的第一只仿生扑翼蝴蝶(附完整代码解析)

本文详细介绍了如何利用Arduino和FS-i6X遥控器从零开始制作仿生扑翼蝴蝶,包括硬件准备、电路连接、代码解析和调试技巧。通过完整的代码示例和参数说明,帮助读者快速掌握仿生机器人的制作要点,实现蝴蝶的自然飞行效果。

weixin_28727975的博客 309

【手撕 Spring】Spring 的新特性

Spring 3.1是Spring框架的一个版本,引入了一些新的特性和改进。以下是Spring 3.1的一些主要特性: 1. 缓存抽象层:Spring 3.1引入了一个新的缓存抽象层,使得开发者可以更方便地使用缓存来提高应用程序的性能。它提供了对不同缓存提供商(如Ehcache、Redis等)的支持,并且可以通过注解或XML配置来管理缓存。 2. Spring MVC的改进:Spring 3.1对Spring MVC进行了一些改进,提供了更好的RESTful支持和更灵活的请求映射。它还引入了一些新

激流丶的博客 5527

从零开始:YOLOv8车牌检测模型训练全流程实战

本文详细介绍了从零开始训练YOLOv8车牌检测模型的全流程实战指南。内容涵盖环境搭建、数据集收集与标注、模型配置与训练、评估测试及高级优化技巧。通过使用预训练模型和迁移学习,开发者可以高效构建精准的车牌检测系统,并掌握模型导出与部署的关键步骤。

weixin_29061041的博客 335

绕过Cloudflare的两种简便方案

绕过Cloudflare的两种简便方案

自成背后的博客 1万+

​​Spring Boot 4 教程:云原生时代的重大升级与新特性详解​

​Spring Boot 4 是 Spring 生态系统的一次重大迭代,基于 ​​ 构建,带来了 ​​ 等众多新特性,同时 ​​,并对 ​​ 进行了深度优化。本教程将带你快速掌握 ​​,帮助开发者高效适应这一重大版本升级。

Rysxt_的博客 1801

损失函数大汇总(五十三)(Boundary Loss附公式推导与代码)

摘要 Boundary Loss是一种针对图像分割任务的新型损失函数,特别适用于高度类别不平衡的细粒度分割场景。与传统的区域型损失(如Dice、交叉熵)不同,它通过计算预测边界与真实边界之间的距离来优化模型,更关注边界精度而非区域重叠。核心思想是利用距离图(distance map)将边界约束转化为区域积分形式,实现端到端训练。具体实现中,损失函数为预测概率与距离图的点积,梯度仅取决于距离图,具有明确的空间引导性。相比区域型损失,Boundary Loss能更好处理小目标、细长结构等边界敏感任务,可与Dic

悦学共鸣,温柔以待,汇聚光芒,共同成长 239

Spring Security学习:04.Spring Security 4.1 的新特性

案例代码 因为 Spring Security 是一个开源项目,我们强烈建议你check out github上的代码。你将可以看到所有的案例应用以及如何使用最新的 Spring Security API来构建应用。在进行调试的时候,有源码也是非常有帮助的。异常栈的追踪不再是黑盒,你可以直接定位引起问题的那一行代码来查看到底发生了什么。对于一个项目而言,源代码是其终极文档,而且通常是发现事情是如何进行的最简单的地方。 要获得这个项目的源码,使用如下的git命令 gitclonehttps://gi..

365

YOLOv11涨点改进 | Conv篇/小目标改进 | YOLOv11引入SPDConv卷积特征无损下采样模块,增加YOLOv11小目标P2检测层(助力小目标任务高效涨点)

本文提出了一种创新的SPDConv模块来优化YOLOv11模型,通过空间到深度(SPD)层和非步幅卷积层实现特征无损下采样。该方法有效解决了传统CNN中因跨步卷积和池化层导致的细粒度信息丢失问题,特别提升了小目标检测性能。实验表明,SPDConv在目标检测和图像分类任务中显著优于现有SOTA模型。文章详细介绍了模块原理、核心代码实现,并提供了YOLOv11集成SPDConv的具体方法,包括配置文件修改和P2层增强等优化技巧。该技术为计算机视觉任务提供了一种高效的特征保留方案。

Ai缝合怪、助力小伙伴高效发论文 586

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

第二部分: spring4.x的新特性

3.Spring框架4.0的新特性和增强功能 Spring框架自从第一次在2004年发行后,就有了几个重大意义的版本。Spring2.0版本提供XML命名空间和AspectJ支持;Spring2.5发行了annotiation-driven配置;Spring3.0引入了一个强大的java 5 +基础框架的代码库,并如基于java @配置模型特点。 4.0版本是最新的发行版并且第一次完全支

野指针 406

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spring Boot 4.0 发布总结:新特性、依赖变更与升级

摘要:SpringBoot 3.x系列是当前最新稳定版本,基于Java17+并支持GraalVM原生镜像编译。主要更新包括JakartaEE9+依赖迁移、SpringFramework6.0增强和Micrometer观测性改进。升级需注意构建工具配置更新、配置文件兼容性检查及测试框架调整。未来4.0版本可能支持Java21+和深化GraalVM集成。建议参考官方指南进行升级。(149字)

2601_94847594的博客 376

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Spring Boot 4 新特性:模块化架构

Spring 团队意识到:要保持 Spring Boot 的“轻量”和“易用”,就必须重新设计其架构边界,这正是 Spring Boot 4 模块化的出发点。但到了 Spring Boot 3.5,这个包已经膨胀至 2 MB,支持的功能越来越多,但复杂度和体积也随之增长。对于想要构建更轻、更快、更可控的企业级应用而言,Spring Boot 4 的模块化,是一场值得投入的升级。Spring Boot 4 的模块化不仅让框架变得更清晰、更轻量,也让开发体验更自然、更高效。

fuladulu的博客 469

SpringBoot 4 最被低估的新特性:Spring Data AOT

后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...,在传统的 Spring Data 应用中,每次启动,框架都会做大量工作。

犬小哈 62

Spring Boot 4.4 新特性深度解析:构建更现代化的 Java 应用

Spring Boot 4.4 是在 Spring Framework 6.2 基础上构建的,它不仅继承了 Spring Boot 一贯的约定优于配置理念,还引入了许多现代化的特性,特别是在云原生、可观测性和开发体验方面有了显著提升。Spring Boot 4.4 是一个值得升级的版本,它带来的新特性可以帮助我们构建更现代化、更高效的应用程序。逐步迁移:先在非核心服务上试用新版本充分利用原生镜像:对于 Serverless 场景特别有价值加强可观测性:利用新的监控和日志特性拥抱虚拟线程。

alex_goden的博客 1189

Spring Boot 4.3 新特性:构建更智能的 Java 应用

Spring Boot 4.3 带来了许多令人兴奋的新特性和改进,包括虚拟线程支持、智能配置管理、可观测性增强、云原生支持和安全性增强等。这些新特性将帮助开发者构建更智能、更高效、更可靠的 Java 应用。这其实可以更优雅一点。希望这篇文章能帮助大家更好地理解和应用 Spring Boot 4.3 的新特性。如果你有任何问题,欢迎在评论区留言。关于作者:我是 Alex,一个在 优快云 写 Java 架构思考的暖男。喜欢手冲咖啡,养了一只叫"Java"的拉布拉多。

alex_goden的博客 4533

Spring4新特性:Groovy Bean定义DSL

Spring4支持使用Groovy DSL来进行Bean定义配置,其类似于XML,不过因为是Groovy DSL,可以实现任何复杂的语法配置,但是对于配置,我们需要那么复杂吗?本着学习的态度试用了下其Groovy DSL定义Bean,其主要缺点: 1、DSL语法规则不足,需要其后续维护; 2、编辑器的代码补全需要跟进,否则没有代码补全,写这个很痛苦; 3、出错提示不友好,排错难;

程序猿开发日志【学习永无止境】 5172
上一篇: Spring4新特性:泛型限定式依赖注入
下一篇: 马云发内部信: 2014阿里巴巴ALL IN移动电商
yangxt
博客等级 码龄20年 172粉丝 78原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值