新闻详情

新闻详情

首页 / 资讯中心 / 详情

Spring Boot 异步

发布时间:2026/9/28 15:11:51来源:尧图网络
Spring Boot 异步
当某个请求执行非常耗时当有大量访问该请求的时候再访问请求其他服务时会出现没有连接使用的情况。造成这种现象的主要原因是容器中线程的数量是一定的如果当所有线程都正在用来处理请求服务的时候再有请求进来就没有多余的连接可用只能拒绝连接。SpringBoot异步机制可以使请求到了controller的时候容器中的线程直接返回同时使用系统内部的线程来执行耗时的服务处理结束后果再将请求返回给客户端。Servlet 3.0 新增了请求的异步处理Spring 3.2 也在此基础上做了封装处理。Spring通过任务执行器TaskExecutor来实现多线程和并发编程。使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor。在 Spring Boot 框架中可以在配置类中添加EnableAsync开始对异步任务的支持并将相应的方法使用Async注解来声明为一个异步任务。对于Transactional、Async等注解Spring扫描到具有这些注解方法的类时生成一个代理类由代理类去执行所以异步方法必须在类外部调用并且Async所修饰的不能是static方法。获取得到执行结果则可设置异步函数返回类型为FutureComponent public class MyAsyncTask { Async public FutureString task1() throws InterruptedException{ return new AsyncResultString(task1执行完毕); }Controller的方法可以很快返回一个java.util.concurrent.Callable或DeferredResult同时Servlet容器的主线程退出和释放这并不意味着客户端收到了一个响应。//Callable Controller public class DefaultController { RequestMapping(/async/test) ResponseBody public CallableString callable() { //调用后生成一个非web线程来执行部分代码。 return new CallableString() { Override public String call() throws Exception { Thread.sleep(3 * 1000L); return finish System.currentTimeMillis(); } }; } } //DeferredResult RestController public class AsyncDeferredController { private final TaskService taskService; Autowired public AsyncDeferredController(TaskService taskService) { this.taskService taskService; } RequestMapping(value /deferred, method RequestMethod.GET, produces text/html) public DeferredResultString executeSlowTask() { DeferredResultString deferredResult new DeferredResult(); CompletableFuture.supplyAsync(taskService::execute).whenCompleteAsync((result, throwable) - deferredResult.setResult(result)); return deferredResult; } }Callable的其它示例public static void main(String[] args) throws ExecutionException, InterruptedException { CallableString callable new CallableImpl(my callable test!); FutureTaskString task new FutureTask(callable); new Thread(task).start(); //调用get()会阻塞主线程。 String result task.get(); }Callable和DeferredResult的区别Callable和DeferredResult效果都是释放容器线程在另一个线程中运行长时间的任务。不同的是谁管理执行任务的线程Callable在执行线程完毕时返回。Deferredresult是通过设置返回对象值返回可以在任何地方控制返回。定时任务1.在程序入口类上添加类注解 EnableScheduling 来启用计划任务2.在定时任务的类上加上类注解 Component在具体的定时任务方法上加上注解 Scheduled 启动该定时任务。Scheduled(initialDelay10000, fixedDelay10000) //10 seconds, or use cron express默认所有的Scheduled都是串行执行的并行需要继承SchedulingConfigurer类并重写其方法实现并行任务。Configuration EnableScheduling public class ScheduleConfig implements SchedulingConfigurer { Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setScheduler(taskExecutor()); } Bean(destroyMethodshutdown) public Executor taskExecutor() { return Executors.newScheduledThreadPool(100); } }当某个请求执行非常耗时当有大量访问该请求的时候再访问请求其他服务时会出现没有连接使用的情况。造成这种现象的主要原因是容器中线程的数量是一定的例如500个当这500个线程都正在用来处理请求服务的时候再有请求进来没有多余的连接可用了只能拒绝连接。SpringBoot异步机制可以使请求到controller中时容器线程直接返回同时使用系统内部的线程来执行耗时的服务处理结束后果再将请求返回给客户端。Servlet 3.0 新增了请求的异步处理Spring 3.2 也在此基础上做了封装处理。Spring通过任务执行器TaskExecutor来实现多线程和并发编程。使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor。在 Spring Boot 框架中可以在配置类中添加EnableAsync开始对异步任务的支持并将相应的方法使用Async注解来声明为一个异步任务。对于Transactional、Async等注解spring扫描时具有这些注解方法的类时生成一个代理类由代理类去执行所以异步方法必须在类外部调用并且Async所修饰的不能是static方法。获取得到执行结果则可设置异步函数返回类型为Future。preComponentpublic class MyAsyncTask {Asyncpublic FutureString task1() throws InterruptedException{return new AsyncResultString(task1执行完毕);}/preController的方法可以很快返回一个java.util.concurrent.Callable或Deferredresult同时Servlet容器的主线程退出和释放这并不意味着客户端收到了一个响应。pre//CallableControllerpublic class DefaultController {RequestMapping(/async/test)ResponseBodypublic CallableString callable() {//调用后生成一个非web线程来执行部分代码。return new CallableString() {Overridepublic String call() throws Exception {Thread.sleep(3 * 1000L);return finish System.currentTimeMillis();}};}}//DeferredResultRestControllerpublic class AsyncDeferredController {private final TaskService taskService;Autowiredpublic AsyncDeferredController(TaskService taskService) {this.taskService taskService;}RequestMapping(value /deferred, method RequestMethod.GET, produces text/html)public DeferredResultString executeSlowTask() {DeferredResultString deferredResult new DeferredResult();CompletableFuture.supplyAsync(taskService::execute).whenCompleteAsync((result, throwable) - deferredResult.setResult(result));return deferredResult;}}/preCallable的其它示例prepublic static void main(String[] args) throws ExecutionException, InterruptedException {CallableString callable new CallableImpl(my callable test!);FutureTaskString task new FutureTask(callable);new Thread(task).start();//调用get()会阻塞主线程。String result task.get();}/preCallable和Deferredresult的区别Callable和Deferredresult效果都是释放容器线程在另一个线程中运行长时间的任务。不同的是谁管理执行任务的线程Callable在执行线程完毕时返回Deferredresult是通过设置返回对象值返回可以在任何地方控制返回。https://blog.csdn.net/he90227/article/details/52262163Spring MVC 异步处理请求提高程序性能h1定时任务/h11.在程序入口类上添加类注解 EnableScheduling 来启用计划任务2.在定时任务的类上加上类注解 Component在具体的定时任务方法上加上注解 Scheduled 启动该定时任务。Scheduled(initialDelay10000, fixedDelay10000) //10 seconds, or use cron express默认所有的Scheduled都是串行执行的并行需要继承SchedulingConfigurer类并重写其方法实现并行任务。preConfigurationEnableSchedulingpublic class ScheduleConfig implements SchedulingConfigurer {Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.setScheduler(taskExecutor());}Bean(destroyMethodshutdown)public Executor taskExecutor() {return Executors.newScheduledThreadPool(100);}}/pre详解SpringBoot Schedule配置http://www.cfei.net/archives/88832
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

RK3588视频处理实战:OpenCL硬件加速与CPU方案性能对比 2026/9/28 16:08:55

RK3588视频处理实战:OpenCL硬件加速与CPU方案性能对比

1. 为什么要在RK3588上折腾OpenCL硬件加速RK3588这颗芯片在嵌入式圈子里火得一塌糊涂,8核CPU(4个A76大核加4个A55小核)配上Mali-G610 MP4 GPU,还有独立的NPU和VPU,纸面参数看着就让人流口水。但真拿它做视频处理的时候…

阅读更多 →
路标检测专用YOLO数据集:解决小目标、反光、密集遮挡 2026/9/28 16:08:55

路标检测专用YOLO数据集:解决小目标、反光、密集遮挡

简介:本资源是一套面向计算机视觉初学者与YOLO目标检测实践者的路标识别专项数据集及配套开发套件,专为交通场景下的小目标检测模型训练与教学实验设计。压缩包共2000个文件,含1000张真实道路场景高清图片,以及严格对齐的VOC&…

阅读更多 →
西门子S7-1200 PLC入门:博途与PLCSIM仿真环境搭建指南 2026/9/28 16:08:54

西门子S7-1200 PLC入门:博途与PLCSIM仿真环境搭建指南

1. 为什么入门1200PLC要先啃下博途加PLCSIM这块硬骨头刚接触西门子S7-1200的朋友,十有八九都卡在同一个地方:软件装完了,界面打开了,面对满屏的树形菜单和灰色按钮,完全不知道从哪下手。更让人抓狂的是,手头…

阅读更多 →
AI应用开发实战:Vibe Coding+LangGraph+RAG工程化工作流 2026/9/28 16:08:54

AI应用开发实战:Vibe Coding+LangGraph+RAG工程化工作流

1. 项目概述:这不是“又一个AI课”,而是一套可直接上手的AI应用开发工作流“2026年上硅谷AI全能开发 Vibe Coding顶配”——这个标题里没有虚词,全是实打实的动作信号。“上硅谷”不是地理概念,而是指代一套已被头部科技公司验证过…

阅读更多 →
欧诗鹊在院线护肤渠道的运营经验,对门店项目搭建有哪些具体参考价值 2026/9/28 16:08:48

欧诗鹊在院线护肤渠道的运营经验,对门店项目搭建有哪些具体参考价值

行业立意:扎根线下实体美业,回应问题肌护理真实需求 产业升级的核心命题:实体美容院的项目升级痛点线下实体美业发展至今,早已走过了基础护理项目普及的阶段。很长一段时间以来,传统综合美容院、社区美容店的服务多集中…

阅读更多 →
Python+CNN水果识别毕业设计:从环境搭建到预测演示 2026/9/28 16:08:41

Python+CNN水果识别毕业设计:从环境搭建到预测演示

简介:这套Python基于深度学习CNN的水果识别系统,是面向计算机相关专业毕业设计、期末大作业及项目实战学习者的完整源码包。项目经导师指导并评定为98分,源码均通过本地编译和严格调试,可直接运行。资源包共2000个文件&#xff0c…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉