目录
Spring中异步方法的使用
1. 异步方法描述
2. 异步方法的实现步骤
3. 实测一下
3.1 定义个Service类
3.2 定义个测试Controlle
3.3 在启动类上启用异步
3.4 测试
4. 补充
4.1 Executor线程池
4.2 异步返回Futrue
4.3 其他注意事项
异步方法,顾名思义就是调用后无须等待它的执行,而继续往下执行;@Async是Spring的一个注解,在Spring Boot中,我们只需要使用@Async注解就能简单的将原来的同步函数变为异步函数。
对于比较耗时的操作,我们可以抽取成异步方法来让主线程稳定快速继续执行,对于异步方法的执行结果可根据自己的要求是否需要在主线程处理;
在springboot应用我们可以使用简单的两个注解即可开启并使用异步方法;
创建一个普通的Service类,并有@Service修饰,表示这个服务类交给Spring管理;
在Service方法里定义一个普通的方法,使用@Async修饰;表示这是一个异步方法;
在引导类中添加@EnableAsync注解,使应用开启对异步方法的支持;
可以看到输出,controlle中调用了异步方法后继续执行,即使异步方法报错也不会controller的执行;
上面的测试,我们并没有创建新的线程和线程池,如果我们不配置线程池的Bean,Spring会自动创建SimpleAsyncTaskExecutor,并使用它来执行异步方法。定义线程池bean可参考如下:
4.2.1 这样改造我们的异步方法,即返回一个Futrue类型的结果;
4.2.2 Contorller也改造下
使用了Futrue.get方法,controller主线程就会等待异步方法的执行结束,或等待超时后才会结束。
在同一个类中的方法调用,添加@async注解是失效的。原因是当你在同一个类中的时候,方法调用是在类中执行的,spring无法截获这个方法调用,也就不会在代理类里执行。
可能会导致循环依赖,spring本身会解决循环依赖,但是因为@Async使用代理模式,spring在检查第二级缓存和原始对象是否相等时发现不相等,会抛出异常。
无法获取请求上下文。