🎉🎉《Spring Boot实战案例合集》目前已更新172个案例,我们将持续不断的更新。文末有电子书目录。
💪💪永久更新承诺
我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务。
💌💌如何获取
订阅我们的合集《点我订阅》,并通过私信联系我们,我们将第一时间将电子书发送给您。
环境:SpringBoot3.4.2
1. 简介
@Async是Spring框架提供的一个注解,用于标记一个方法,使其能够在一个单独的线程中异步执行。这在处理耗时操作(如发送邮件、调用外部API等)时非常有用,可以显著提高应用程序的性能和响应速度。
作为一个真正的技术探索者,总是希望能够深入理解每一项技术的底层原理。今天,我们将通过打造一个名为@PackAsync的注解,来亲自实现异步任务功能。这不仅是一次对Spring @Async功能的复刻,更是一次对异步任务执行机制进行深度剖析。
通过本篇文章的学习,你将全面把握异步任务的调度、执行与结果处理。
我们将会应用到如下的技术点:
最终实现的效果如下:
// 开启异步任务public classApp{}// 异步任务(value = "测试异步任务 - 01", executor = "packExecutor")public void task() {}
接下来,我们将详细的一步一步的实现自定义的异步任务。
2. 实战案例
2.1 自定义异步任务注解
public PackAsync {/**任务名称*/String value() default"" ;/**任务任务执行的线程池*/String executor() default"" ;}
说明:
value:用来定义任务的名称,但是在本篇文章中我们将咱不使用。
executor:定义当前异步任务执行的线程池对象beanName。
2.2 定义切面
该切面用来处理具有@PackAsync注解的方法。同时我们还必须考虑一个问题就是当遇到事务时,不能导致事务失效,也就是说要先让异步线程先执行,然后才是事务的切面。
我们的切面不将使用最为常用的@Aspect方式,而是采用Advisor定义切面。这样能更加灵活的控制。
public class PackAsyncAnnotationAdvisor implements PointcutAdvisor{private ExecutorService executor ;private BeanFactory beanFactory ;public PackAsyncAnnotationAdvisor(ExecutorService executor, BeanFactory beanFactory){this.executor = executor ;this.beanFactory = beanFactory ;}// 切面的增强逻辑Advicepublic Advice getAdvice(){return new PackAsyncInterceptor(this.executor, this.beanFactory) ;}// 用来匹配切入点的public Pointcut getPointcut() {return new PackAsyncPointcut() ;}}


