SpringBoot整合异步任务执行

embedded/2024/10/11 5:08:03/

同步任务:

同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等

并发问题

同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用

户体验

异步任务:

异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源利用

率高,用户体验好

异步任务需要创建额外的线程来执行任务操作,可以使用线程池技术,灵活配置线程资源,以提高

系统的资源利用率

应该场景:比如用户的操作日志,我操作完之后还需要去执行日志记录,这个时候如果日志记录比较慢,那么用户就需要一直等待,体验感较差,我们应该开启一个新的线程去执行日志记录,返回给用户操作成功。比较经典应用就是下单。

调用python程序,我这边不可能一直等待python程序调用,给调用的代码加一个异步处理,直接返回给前端调用成功,对于python代码的调用结果可以通过websocket推送到前端去。

springBoot框架使用异步

在启动类上加上注解
java">@EnableAsync  // 启用异步任务支持
在需要异步的方法上面添加注解
java"> @Asyncpublic  void  print() throws InterruptedException {Thread.sleep(3000);System.out.println("这是执行的异步方法"+System.currentTimeMillis());}

调用异步方法

java">@Autowired
private testService testService;
@SneakyThrows //这个是抛异常的
@GetMapping("/hello")
public String  asny(){System.out.println("hello world");testService.print();return "hello"+System.currentTimeMillis();
}

注意异步方法不能和调用的方法同一个类中,否则异步不会生效。

使用了异步之后,方法会直接返回,下面的操作会在后面慢慢执行。

  • 异步调用必须通过代理: 确保异步方法是在不同的 Spring 管理的 bean 中调用,而不是在同一个类中直接调用。
  • 启用异步功能: 在启动类中添加 @EnableAsync 注解,以启用 Spring 的异步功能。

配置自定义线程池


**默认情况下,Spring Boot 使用一个简单的线程池来执行异步任务。如果你需要更复杂的配置,例如增加线程池大小或设置线程名称前缀,可以自定义 **Executor**。 **

java">package com.njitzx.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;@Configuration //交给spring容器管理
public class AsyncConfig implements AsyncConfigurer {@Bean(name = "asyncExecutor")public Executor asyncExecutor() {// 定义线程池,使用Spring提供的ThreadPoolTaskExecutorThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(10); // 核心线程数executor.setMaxPoolSize(20); // 最大线程数executor.setQueueCapacity(50); // 缓冲队列大小executor.setKeepAliveSeconds(60); // 线程的空闲时间executor.setThreadNamePrefix("AsyncTaskExecutor-"); // 线程前缀executor.setRejectedExecutionHandler(newThreadPoolExecutor.CallerRunsPolicy()); // 拒绝处理策略,交由调用方线程运行executor.initialize(); // 初始化return executor;}@Overridepublic Executor getAsyncExecutor() {return asyncExecutor();}
}

http://www.ppmy.cn/embedded/125258.html

相关文章

Springboot 文件上传

文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。 文件上传前端需要完成的准备: 需要提交一个form表单,表单必须包含以下三点(上传文件页面三要素) …

[MAUI]数据绑定和MVVM:MVVM的属性验证

一、MVVM的属性验证案例 Toolkit.Mvvm框架中的ObservableValidator类,提供了属性验证功能,可以使用我们熟悉的验证特性对属性的值进行验证,并将错误属性提取和反馈给UI层。以下案例实现对UI层的姓名和年龄两个输入框,进行表单提交验证。实现效果如下所示 View<ContentP…

JavaSE——集合1:Collection接口(Iterator和增强for遍历集合)

目录 一、集合框架体系(重要) 二、集合引入 (一)集合的理解与好处 三、Collection接口 (一)Collection接口实现类的特点 (二)Collection接口常用方法 (三)Collection接口遍历元素的方式(Iterator和增强for) 1.使用Iterator(迭代器) 1.1Iterator(迭代器)介绍 1.2Itera…

大数据新视界 --大数据大厂之 Presto 性能优化秘籍:加速大数据交互式查询

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

SparkSQL-性能调优

祝福 在这个举国同庆的时刻&#xff0c;我们首先献上对祖国的祝福&#xff1a; 第一&#xff0c;我们感谢您给我们和平的环境&#xff0c;让我们能快乐生活 第二&#xff0c;祝福我们国家未来的路越走越宽广&#xff0c;科技更发达&#xff0c;人民更幸福 第三&#xff0c;…

Cobalt Strike

信息收集 主机信息收集 # ip信息 shell ipconfig # 系统信息&#xff0c;补丁信息 shell systeminfo # 架构 shell echo %PROCESSOR_ARCHITECTURE% # 软件信息 shell wmic product get name,version # 查看安装服务 shell wmic service list brief # 查看运行进程 shell tal…

大学生就业市场:Spring Boot招聘系统的设计与实现

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

PostgreSQL的pglz使用限制

PostgreSQL的pglz使用限制 在 PostgreSQL 中&#xff0c;PGLZ&#xff08;PostgreSQL Lightweight Compression Algorithm&#xff09;是一种用于压缩数据的算法&#xff0c;主要用于 TOAST&#xff08;The Oversized-Attribute Storage Technique&#xff09;机制。PGLZ 的使…