`

Spring中@Async 异步不执行问题

 
阅读更多

 

【问题中的配置】

  

  spring相关配置文件root-context.xml mvc-context.xml其中mvc-context.xml被包含于root-context.xml 

  web.xml的配置为

  <context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>

  WEB-INF/spring/root-context.xml

</param-value>

  </context-param>

  

  <servlet>

    <servlet-name>haha</servlet-name>

    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <init-param>

      <param-name>contextConfigLocation</param-name>

      <param-value>/WEB-INF/spring/mvc-context.xml</param-value>

    </init-param>

    <load-on-startup>1</load-on-startup>

  </servlet>

  <servlet-mapping>

    <servlet-name>haha</servlet-name>

    <url-pattern>/</url-pattern>

  </servlet-mapping>

  

  添加@Async的类被 <context:component-scan base-package="com.haha.service.impl"></context:component-scan>和

  <context:component-scan base-package="com.haha.controller"></context:component-scan>放于mvc-context.xml

  

 

【修改后Ok的配置】

 将 <context:component-scan base-package="com.haha.service.impl"></context:component-scan>放于root-context.xml

  注意不能将controller的也迁移到root-context.xml,否则controller的Bean无法实例化

 

 

 

原因:详见解决要点

===========================================

解决要点:

一、In short, the context loaded by the ContextLoaderListener (generally from applicationContext.xml) is the parent of the context loaded by the DispatcherServlet (generally from *-servlet.xml). If you have the bean with the @Async method declared/component-scanned in both contexts, the version from the child context (DispatcherServlet) will override the one in the parent context (ContextLoaderListener). I verified this by excluding that component from component scanning in the *-servlet.xml -- it now works as expected.

 

要点:注意component-scan里面扫包不要重复扫。

===========================================

解决问题参考文献:

http://blog.csdn.net/haiyangzhishen/article/details/46930677

今天用了一下spring的@Async功能,遇到了一些问题。大家用的时候一定要注意:

1、异步方法和调用类不要在同一个类中

2、注解扫描时,要注意过滤,避免重复实例化,因为存在覆盖问题,@Async就失效了

 

非常感谢下面三篇文章的作者:

http://www.kaifajie.cn/XiangMuKuangJia/s13035.html

http://www.cnblogs.com/youngjoy/p/3817471.html

http://blog.csdn.net/jokes000/article/details/24649173

分享到:
评论

相关推荐

    JAVA 中Spring的@Async用法总结

    JAVA 中Spring的@Async用法总结 在 Java 应用中,绝大多数情况下都是通过同步的方式来实现交互处理的...以上就是 Spring 中 @Async 的用法总结,通过使用 @Async 可以轻松地实现异步调用,提高系统的响应速度和性能。

    Spring中@Async注解执行异步任务的方法

    Spring中@Async注解执行异步任务的方法 在业务处理中,有些业务使用异步的方式更为合理。这篇文章主要介绍了Spring中@Async注解执行异步任务的方法。@Async注解是Spring提供的一个annotation,可以将方法异步化,...

    Spring Boot @Async 异步任务执行方法

    Spring Boot @Async 异步任务执行方法 Spring Boot 框架提供了 @Async 注解来支持异步任务执行,该注解可以将方法调用转换为异步调用,从而提高应用程序的并发能力和响应速度。下面是关于 Spring Boot @Async 异步...

    浅谈Spring @Async异步线程池用法总结

    浅谈Spring @Async异步线程池用法总结 本文主要介绍了Spring @Async异步线程池的用法总结,包括异步线程池的接口类、@Async定义异步任务、Spring开启异步配置等内容。 1. 异步线程池的接口类 Spring提供了多种...

    springboot中@Async异步调用注解的使用

    - 异步方法不会阻塞当前执行线程,而是立即返回,并在后台线程中执行实际的方法逻辑。 2. **配置异步支持** - 在Spring Boot应用中,需要启用异步支持。这通常通过在主配置类(通常带有@SpringBootApplication...

    关于Spring中@Async注解使用

    @Async 注解是 Spring 框架提供的一种异步执行方法的实现方式,从 Spring 3.0 版本开始提供。使用 @Async 注解可以将方法标识为异步方法,通过 SimpleAsyncTaskExecutor 执行,但不推荐使用这个默认线程池。 @Async...

    Spring Boot利用@Async如何实现异步调用:自定义线程池

    在Spring Boot中,使用@Async注解可以将方法异步执行。@Async注解可以应用于方法上,使得该方法可以异步执行。例如: ```java @Async public void doTask() { // 异步执行的任务 } ``` 在上面的代码中,doTask()...

    关于Spring注解@Async引发其他注解失效的解决

    Spring 框架提供了多种注解来帮助开发者简化代码,例如 @Async 用于异步执行方法、@Transaction 用于事务管理等。但是,在使用这些注解时,可能会遇到一些问题,例如 @Async 注解引发其他注解失效的问题。 在文章中...

    深入理解Spring注解@Async解决异步调用问题

    本文将详细介绍Spring框架中的@Async注解,并深入理解其在解决异步调用问题中的应用。通过示例代码和详细的解释,帮助读者更好地理解@Async的使用和原理。 一、异步调用和同步调用 异步调用和同步调用是两种不同的...

    Spring @async方法如何添加注解实现异步调用

    @Async 注解,如果包含的,Spring 会为该 Bean 动态生成一个代理类,代理类是继承我们所写的 Bean 的,然后把代理类注入进来,那此时,在执行此方法的时候,会到代理类中,代理类判断了此方法需要异步执行,就不会...

    Spring中@Async注解实现异步调详解

    Spring中@Async注解实现异步调用详解 在Spring框架中,@Async注解是实现异步调用的一个重要机制。异步调用是指在程序执行过程中,不需要等待某个方法的执行结果,而是继续执行下一个方法。这种机制可以极大地提高...

    简述Springboot @Async 异步方法

    Spring Boot @Async 异步方法是 Spring Boot 框架中的一种异步编程方式,允许开发者在不阻塞主线程的情况下执行高耗时方法。下面将详细介绍 Spring Boot @Async 异步方法的使用和原理。 什么是异步调用 异步调用是...

    Spring Boot利用@Async异步调用:使用Future及定义超时详解

    在Spring Boot应用中,我们可以利用`@Async`注解实现异步调用,这有助于提高应用程序的并发性能,尤其在处理耗时操作时。本文将详细介绍如何使用`@Async`结合`Future`来处理异步任务,并探讨如何定义超时。 `@Async...

    spring boot中使用@Async实现异步调用任务

    在Spring Boot中,异步调用是通过Spring的`@Async`注解来实现的,它允许我们在不阻塞主线程的情况下执行耗时的操作。这极大地提高了应用的响应速度,尤其是在处理大量并发请求时。接下来,我们将深入探讨如何在...

    @scheduled任务调度使用详解及@scheduled与多线程和@Async异步任务结合使用

    Spring的`@Async`注解用于标记一个方法为异步执行,它与`@Scheduled`结合可以实现异步定时任务。首先,我们需要启用异步支持: ```java @Configuration @EnableAsync public class AsyncConfig implements ...

    Spring中@Async用法详解及简单实例

    一旦标记了一个方法,Spring会在单独的线程中执行该方法,让调用者可以立即返回继续执行其他代码。启用@Async功能有两种方式: - **基于Java配置**: ```java @Configuration @EnableAsync public class ...

    Springboot启用async异步调用

    在上述代码中,`longRunningTask`方法被标记为异步,这意味着当它被调用时,Spring会将其放入一个单独的线程中执行,而不会阻塞当前请求的处理。`Future`返回类型允许我们在需要时获取异步任务的结果。 为了调用这...

    Spring中异步注解@Async的使用、原理及使用时可能导致的问题及解决方法

    Spring 中异步注解 @Async 的使用、原理及使用时可能导致的问题及解决方法 @Async 注解是一种非常有用的spring 注解,它可以让被标注的方法异步执行,从而提高应用程序的性能和响应速度。但是,@Async 注解的使用也...

    【java框架】SpringBoot(10) -- SpringBoot巧用 @Async提升API接口并发能力 .pdf

    在Spring Boot中,你可以通过`logging.level.org.springframework.scheduling=DEBUG`配置日志级别,来查看异步任务的执行情况。此外,还可以利用Actuator模块的 `/async`端点监控异步任务的状态和执行时间。 5. **...

    spring boot 使用@Async实现异步调用方法

    每个`@Async`注解的方法会在后台线程中执行,而不是在调用它们的主线程中。这意味着,即使这些方法执行时间较长,也不会阻塞主线程。需要注意的是,`@Async`不适用于静态方法,因为它依赖于Spring的代理机制,而静态...

Global site tag (gtag.js) - Google Analytics