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容器管理。(方法一定要从另一个类中调用,也就是从类的外部调用,类的内部调用是无效的)(如果需要从类的内部调用,需要先获取其代理类)

 

posted @ 2022-04-12 15:05  1156740846  阅读(2680)  评论(0编辑  收藏  举报