美文网首页
Spring 中使用@Async注解失效的问题原因及解决方法

Spring 中使用@Async注解失效的问题原因及解决方法

作者: 闲的蛋疼VIP | 来源:发表于2019-05-08 17:17 被阅读0次
  1. 背景

    项目中有任何需要花费比较长的时间才可以返回结果,时间几十秒到几小时不等,时间过长前端会一直处于等待消息返回的状态,通过查找资料,计划通过异步的方式解决改问题,耗时任务通过@Async异步执行,然后直接返回消息给前端,避免长时间等待。但是在测试时发下,@Async注解并没有生效,该方法还是顺序执行。

  2. 排查

    项目中使用xml文件对spring进行配置,在spring的配置文件中开启了异步和task命名空间

    <task:annotation-driven/>
    
    xmlns:task="http://www.springframework.org/schema/task"
    http://www.springframework.org/schema/task
    http://www.springframework.org/schema/task/spring-task.xsd
    

    网上提到的一些注意事项也没问题:

    一、异步方法使用static修饰
    二、异步类没有使用@Component注解(或其他注解)导致spring无法扫描到异步类
    三、测试异步方法不能与异步方法在同一个类中
    四、测试类中需要使用@Autowired或@Resource等注解自动注入,不能自己手动new对象
    五、如果使用SpringBoot框架必须在启动类中增加@EnableAsync注解

    最后在一篇博文中,发下有可能多个配置文件的扫描冲突的问题,造成@Async失效的问题。测试发现确实时该问题造成的@Async注解失效的问题。项目中存在Spring的配置文件applicationContext.xml和Spring MVC的配置文件servletConfig.xml,并且二者的配置文件中:

    <context:component-scan base-package="com.demo" />
    

    配置了相同的扫描设置,在web.xml中配置的加载顺序为:applicationContext.xml > servletConfig.xml,后者的component-scan会覆盖前者的,同时前者配置的task也会被覆盖掉不起作用!

  3. 问题解决

    修改Spring MVC的配置文件中的扫描设置,只扫描Controller文件夹下的文件

    <context:component-scan base-package="com.demo.controller" />
    

    修改后,测试发现@Async 成功异步执行。问题解决。

  • 在发现遇到该问题之前,还遇到了@Value注解失效的问题,@Value无法成功注入属性值,当时没有解决该问题,直接通过其他的方法绕过了该问题,没有使用@Value注解。有很大的可能也是该问题造成的。

相关文章

网友评论

      本文标题:Spring 中使用@Async注解失效的问题原因及解决方法

      本文链接:https://www.haomeiwen.com/subject/kasvoqtx.html