Un método @Async
en un @Service
: la clase anotada no se está llamando de forma asíncrona, está bloqueando el hilo.Spring @Async Not Working
Tengo <task: annotation-driven />
en mi configuración, y la llamada al método proviene de fuera de la clase, por lo que el proxy debe ser golpeado. Cuando paso por el código, el proxy es de hecho afectado, pero no parece llegar a ninguna clase relacionada con la ejecución en un ejecutor de tareas.
He puesto puntos de corte en AsyncExecutionInterceptor
y nunca reciben ningún golpe. He depurado en AsyncAnnotationBeanPostProcessor
y puedo ver cómo se aplican los consejos.
El servicio se define como una interfaz (con el método anotado @Async
existe una buena medida) con el método de la aplicación anotada @Async
también. Ninguno de los dos está marcado @Transactional
.
¿Alguna idea de lo que pudo haber salido mal?
- ACTUALIZACIÓN = = -
Curiosamente, funciona solamente cuando tengo mis task
elementos XML en mi archivo app-servlet.xml, y no en mi archivo app-services.xml, y si hacer mi escaneo de componentes sobre servicios desde allí también. Normalmente tengo un archivo XML con solo controladores (y restringe el escaneo de componentes en consecuencia) y otro con servicios (de nuevo con un componente de escaneo restringido de modo que no vuelva a escanear los controladores cargados en el otro) archivo).
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 (no funciona cuando se especifica aquí)
<?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"/>
...
Me estoy perdiendo algo manifiestamente obvio en mi configuración, ¿o hay alguna interacción sutil entre los elementos de configuración?
¿Estás seguro de que estás utilizando el tipo Spring ''@ ASync', y no uno de otra biblioteca? – skaffman
'import org.springframework.scheduling.annotation.Async;' es lo que estoy usando. He visto que cuando se invoca el proxy, cree que la clase declarada (la interfaz) no tiene anotaciones de clase o de nivel de método, ¡lo cual es mentira! –
¿Solo para verificarlo dos veces, se llama al método externamente, no desde el servicio correcto? ¿Y está llamando al método en el servicio que se construyó a partir de Spring, no a un servicio que haya "actualizado"? – Pace