SpringBoot执行异步任务Async介绍

简介: 当我们在使用SpringBoot进行开发的时候,可能会遇到一些执行异步任务的场景,如果每次执行这些异步任务都去新建一个异步线程来执行的话,那代码就太冗余了。幸好SpringBoot给我们提供了Async的注解,让我们能够很轻松地对这些异步任务进行执行。

前言

本篇文章的代码示例已放到 github 上,Git地址为:advance(记录每一个学习过程),大家把代码下载下来之后,全局搜索一些关键代码,即可找到该文章的源码。

大家觉得有用的话,麻烦点个star👍再走呗!

使用场景

当我们在使用SpringBoot进行开发的时候,可能会遇到一些执行异步任务的场景,如果每次执行这些异步任务都去新建一个异步线程来执行的话,那代码就太冗余了。幸好SpringBoot给我们提供了Async的注解,让我们能够很轻松地对这些异步任务进行执行。

使用示例

  1. 在启动类上使用@EnableAsync注解,表示开启异步任务

@EnableAsync

@SpringBootApplication

public class AsycnDemoApplication {

   public static void main(String[] args) {

       SpringApplication.run(AsycnDemoApplication.class, args);

   }

}

  1. 将需要执行的异步方法所在的类,加入到Spring的容器中,可以使用@Component注解

@Component

public class AsyncComponent {

}

  1. 在需要异步执行的方法上,加入@Async注解

@Component

public class AsyncComponent {

   @Async

   public void async(String str){

       System.out.println("输入的内容是" + str + ",异步任务正在休眠5秒..");

       try {

           TimeUnit.SECONDS.sleep(5);

       } catch (InterruptedException e) {

           System.out.println("休眠失败");

       }

       System.out.println("输入的内容是" + str + ",异步任务执行结束");

   }

}

  1. 在其他需要调用的地方,将这个异步方法所在的类进行注入,然后调用

@Component

public class LineRunner implements CommandLineRunner {

   @Autowired

   private AsyncComponent asyncComponent;

   @Override

   public void run(String... args) throws Exception {

       System.out.println("主线程开始");

       asyncComponent.async("今天不上班,好耶");

       asyncComponent.selfAsync();

       System.out.println("主线程结束");

   }

}

  1. 执行结果

自定义异步调用的线程池

SpringBoot默认会使用SimpleAsyncTaskExecutor线程池,这个不是真的线程池,不会重用线程,每次调用都会新建一个线程出来,用完之后就回收掉,没起到重复利用的作用。并发量太大的话,可能会有内存溢出的风险。

因此,更加推荐开发者对异步调用的线程池进行自定义。

  1. 自定义异步线程池

@Configuration

public class ExecutorsAsyncConfig {

   @Bean(name = "asyncConfig")

   public Executor asyncConfig(){

       ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

       //设置核心线程数

       executor.setCorePoolSize(5);

       //设置最大线程数

       executor.setMaxPoolSize(50);

       //设置缓存的队列

       executor.setQueueCapacity(1000);

       //设置空闲线程的超时时间

       executor.setKeepAliveSeconds(1000 * 5);

       //设置线程名称的前缀

       executor.setThreadNamePrefix("async-config-");

       executor.initialize();

       return executor;

   }

}

  1. 编写自定义的异步方法,其实也就就是在@Async的注解上加了线程池的bean名称。

@Async("asyncConfig")

public void selfAsync(){

   System.out.println("我是自定义异步线程,线程池名称:" + Thread.currentThread().getName());

   try {

       TimeUnit.SECONDS.sleep(5);

   } catch (InterruptedException e) {

       System.out.println("休眠失败");

   }

   System.out.println("自定义异步线程休眠结束");

}

  1. 调用自定义的异步方法

asyncComponent.selfAsync();

  1. 执行结果

Async失效场景(注意事项)

  1. 调用方法和异步方法在同一个类中,会导致Async失效。
  2. 异步方法使用了static进行修饰,会导致Async失效。


相关文章
|
4月前
|
Java 关系型数据库 MySQL
springboot项目集成dolphinscheduler调度器 实现datax数据同步任务
springboot项目集成dolphinscheduler调度器 实现datax数据同步任务
561 2
|
4月前
|
人工智能 安全 Java
Spring Boot 中使用 Function 和异步线程池处理列表拆分任务并汇总结果
在Java开发中,处理大规模数据时常常需要将列表拆分为多个子列表进行异步处理并汇总结果。本文介绍如何在Spring Boot中使用Function和异步线程池实现高效且可维护的代码,涵盖结果封装、线程池配置、列表拆分处理及结果汇总等关键步骤。
206 0
|
5月前
|
SQL JSON Java
|
分布式计算 大数据 Java
springboot项目集成大数据第三方dolphinscheduler调度器 执行/停止任务
springboot项目集成大数据第三方dolphinscheduler调度器 执行/停止任务
87 0
|
5月前
|
Java Spring
如何优雅的实现 SpringBoot 并行任务
我是小假 期待与你的下一次相遇 ~
139 1
|
Java 开发者 Spring
【SpringBoot 异步魔法】@Async 注解:揭秘 SpringBoot 中异步方法的终极奥秘!
【8月更文挑战第25天】异步编程对于提升软件应用的性能至关重要,尤其是在高并发环境下。Spring Boot 通过 `@Async` 注解简化了异步方法的实现。本文详细介绍了 `@Async` 的基本用法及配置步骤,并提供了示例代码展示如何在 Spring Boot 项目中创建与管理异步任务,包括自定义线程池、使用 `CompletableFuture` 处理结果及异常情况,帮助开发者更好地理解和运用这一关键特性。
2027 1
|
10月前
|
Java 调度 数据库
SpringBoot整合XXL-JOB【05】- 任务分片
在实际业务中,批量定时任务可能因上一批任务未完成而影响业务。为解决此问题,本文介绍如何使用Xxl-job对批量任务进行分片处理,通过分片广播形式调度集群机器并行执行任务,大幅提升执行效率。具体步骤包括环境准备、添加依赖和配置、声明实体类与查询类,以及改造业务逻辑实现分片查询。测试结果显示,分片处理将两千条数据的执行时间从30秒缩短至15秒,性能提升显著。
1187 13
SpringBoot整合XXL-JOB【05】-  任务分片
|
10月前
|
前端开发 Java API
SpringBoot整合Flowable【07】- 驳回节点任务
本文通过绩效流程的业务场景,详细介绍了如何在Flowable工作流引擎中实现任务驳回功能。具体步骤包括:获取目标任务节点和当前任务节点信息,进行必要的判空和逻辑校验,调用API完成节点回退,并清理相关脏数据(如历史任务和变量)。最后通过测试验证了驳回功能的正确性,确保流程能够成功回退到指定节点并清除中间产生的冗余数据。此功能在实际业务中非常有用,能够满足上级驳回自评等需求。
1282 0
SpringBoot整合Flowable【07】- 驳回节点任务
|
存储 安全 Java
SpringBoot异步任务获取HttpServletRequest
通过上述方法,我们可以在Spring Boot应用中的异步任务获取 `HttpServletRequest`,从而实现更为灵活和高效的异步处理逻辑。
770 64
|
消息中间件 缓存 监控
【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控
springboot的热部署、配置的宽松绑定和校验、任务、邮件、监控、springboot整合JdbcTemplate,h2等sql技术、整合redis,mongodb,es等nosql技术、整合redis,Memcached,jetcache,j2cache等缓存技术、整合ActiveMQ,RabbitMQ,RocketMQ,Kafka等消息的中间件的入门、整合缓存/任务/邮件/监控
【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控