Spring boot 注解@Async不生效 无效 不起作用
问题描述
由于横线上的方法处理6万多条数据的update,耗时需要3 到 4 分钟,这里加个异步处理,但是并未生效
应该是因为aop代理的缘故,被调用方法 和 调用处的代码都处在同一个类,所以只是相当于本类调用,并没有使用代理类 从而@Async并没有产生效果。
解决方案1
通过resource手动获取Executor
@Resource(name = "handlerDataScheduler") private Executor handlerDataScheduler; handlerDataScheduler.execute(()->{ saveMinuteData(newMinuteData, param.getIsFirst(), cols, param); });
解决方案2
整个方法(查询 + update)都加上异步,这样在外面使用spring管理的类 changeEquOperateStrategy 去调用加了异步注解的方法 dealData, 这样就是由spring自己去控制了
总结
@SpringBootApplication启动类添加@EnableAsync注解。
异步方法使用注解@Async的返回值只能为void或者Future,注解的方法必须是public方法。
@Transactional和@Async注解的实现都是基于Spring的AOP,而AOP的实现是基于动态代理模式实现的。那么注解失效的原因就很明显了,有可能因为调用方法的是对象本身而不是代理对象,因为没有经过Spring容器管理。(方法一定要从另一个类中调用,也就是从类的外部调用,类的内部调用是无效的)(如果需要从类的内部调用,需要先获取其代理类)