一个@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配置,您可以使用它来实现。