当前位置: 首页 > 面试题库 >

Spring @Async不起作用

从智志
2023-03-14
问题内容

一个@Async在方法@Service-annotated类不被异步调用-它阻塞线程

我已经进入<task: annotation-driven />配置,对方法的调用来自类外部,因此应该点击代理。当我单步执行代码时,确实会碰到代理,但似乎没有在与在任务执行器中运行相关的任何类附近的任何地方。

我已经设置了断点AsyncExecutionInterceptor,但是它们从未被击中。我已经调试过AsyncAnnotationBeanPostProcessor,可以看到建议得到应用。

该服务被定义为接口(该接口的方法带有适当的注释@Async),实现的方法@Async也带有注释。都没有标记@Transactional

任何想法可能出了什么问题?

-=更新=-

奇怪的是, 只有 当我task在app-servlet.xml文件中有我的XML元素,而在app-
services.xml文件中没有我的XML元素,并且我也从那里扫描服务时,它才起作用。通常,我有一个仅包含控制器的XML文件(并相应地限制了组件扫描),而另一个具有服务的XML文件(又受了组件扫描的限制,因此它不会重新扫描加载到另一个文件中的控制器)文件)。

app-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:jee="http://www.springframework.org/schema/jee" 
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:webflow="http://www.springframework.org/schema/webflow-config" 
xmlns:task="http://www.springframework.org/schema/task"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/task
    http://www.springframework.org/schema/task/spring-task-3.0.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    http://www.springframework.org/schema/jee 
    http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"
>
<task:annotation-driven executor="executor" />
<task:executor id="executor" pool-size="7"/>

<!-- Enable controller annotations -->
<context:component-scan base-package="com.package.store">
    <!-- <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> -->
</context:component-scan>

<tx:annotation-driven/>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<mvc:annotation-driven conversion-service="conversionService" />

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

app-services.xml (在此处指定时无效)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:context="http://www.springframework.org/schema/context" xmlns:task="http://www.springframework.org/schema/task"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/task
        http://www.springframework.org/schema/task/spring-task-3.0.xsd">

    <!-- Set up Spring to scan through various packages to find annotated classes -->
    <context:component-scan base-package="com.package.store">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

    <task:annotation-driven executor="han" />
    <task:executor id="han" pool-size="6"/>
    ...

我是否在配置中缺少明显的东西,或者配置元素之间存在一些微妙的相互作用?


问题答案:

借助RyanStewart的出色回答,我得以弄清楚(至少针对我的特定问题)。

简而言之,ContextLoaderListener(通常来自applicationContext.xml)加载的上下文是DispatcherServlet(通常来自*-servlet.xml)加载的上下文的父级。如果@Async在两个上下文中都具有声明为/component-scanned的方法的bean,则子上下文(DispatcherServlet)中的版本将覆盖父上下文(ContextLoaderListener)中的版本。我通过从组件扫描中排除该组件来验证了这一点*-servlet.xml-现在可以正常工作了。



 类似资料:
  • 我想将我的React应用程序按块拆分,但遇到了一个问题。不呈现通过加载的子。下面的示例代码。 文件一: 文件二 然后检索下一个错误: 未捕获的错误:缩小的React错误#130;访问http://facebook.github.io/react/docs/error-decoder.html?invariant=130&args[]=未定义&args[]=获取完整消息,或使用非缩小的开发环境获取完

  • 独立的Spring Boot应用程序中的注释类中的方法不能异步运行。我做错了什么?

  • 问题内容: 呈现视图时,我遇到了hibernate和延迟加载的(著名的)问题....很多人说,仅有的两种解决方案是: 使方法具有事务性(这并不总是可取的) 使用OpenSessionInViewInterceptor。 后者是可取的IMO。无论如何,我不确定此拦截器是否正在触发(实际上,我得到了相同的延迟加载异常,并且没有任何变化): 我使用的是基于简单注释的URL映射,因此请阅读Spring 3

  • 我有一个服务与下一个方法: 我从控制器中调用getTestWithId100方法,但它只获得新值。 部分ehcache.xml: 为什么它不工作?我尝试了不同的键,但没有成功。

  • 我使用Spring AOP来实现我的应用程序的日志系统。但我有一些麻烦。 我有简单的课

  • 问题内容: 我正在使用spring加载属性文件 当我使用时获得财产价值 它的工作正常。 但是当我尝试使用env时 问题答案: 一个没有属性添加其到。使用Java配置,您可以使用它来实现。