2010-10-30 22 views
12

Estoy usando @Scheduled y ha funcionado bien, pero no puedo hacer funcionar @Async. Lo probé muchas veces, y parece que está haciendo que mi método sea asincrónico. ¿Hay alguna otra cosa, configuración o parámetro que me falta? Tengo una clase que tiene dos métodos uno, el método marcado con @Scheduled, se ejecuta y llama al segundo que se ha marcado con @Async.@Async no funciona para mí

Aquí es mi config:

<!-- Scans within the base package of the application for @Components to configure as beans --> 
<context:component-scan base-package="com.socialmeety" /> 
<context:annotation-config /> 
<tx:annotation-driven transaction-manager="transactionManager" /> 
<task:annotation-driven/> 

<!-- Configures support for @Controllers --> 
<mvc:annotation-driven /> 

<!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory --> 
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/views/"/> 
    <property name="suffix" value=".jsp"/> 
</bean> 

<dwr:configuration /> 
<dwr:annotation-config /> 
<dwr:url-mapping /> 
<dwr:controller id="dwrController" debug="true" /> 

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> 

Gracias.

+0

es el problema? – Bozho

+0

debe proporcionar más información. (fragmentos de código, etc.) – onigunn

+0

no tienen ninguna excepción, simplemente no hace que el método sea asincrónico. ¿Alguna configuración especial para que funcione? esa es mi pregunta, publicaré mi configuración para contar más acerca de mi env. Ya tengo mi @Scheduled funcionando bien. – Thiago

Respuesta

32

Como está llamando a su método @Async desde otro método en el mismo objeto, es probable que esté pasando por alto el código proxy asincrónico y simplemente llame a su método simple, es decir, dentro del mismo hilo.

Una forma de resolver esto es asegurándose de que su llamada al método @Async es de otro objeto. Consulte los comentarios al final de este artículo: http://groovyjavathoughts.blogspot.com/2010/01/asynchronous-code-with-spring-3-simple.html

Pero se pone complicado hacer cosas así, por lo que podría simplemente conectar el TaskScheduler, finalizar su método en Runnable y ejecutarlo usted mismo.

+0

Sin duda, es algo fácil de perder. –

3

Tuve un problema similar a esto. Y pasé mucho tiempo para arreglarlo.

Si utiliza resorte contexto 3.2, también es necesario añadir @EnableAsync en la clase en la que se llama al método service anotada @Async

Tome un vistazo a http://spring.io/guides/gs/async-method/#initial

Espero que te ayude

3

Esta es una respuesta complementaria a la aceptada. Puede llamar a un método asíncrono en su propia clase, pero debe crear un bean autorreferencial.

El único efecto secundario aquí es que no se puede llamar a cualquier código asíncrono dentro del constructor. Es una buena manera de mantener tu código en el mismo lugar.

@Autowired ApplicationContext appContext; 
private MyAutowiredService self; 

@PostConstruct 
private void init() { 
    self = appContext.getBean(MyAutowiredService.class); 
} 

public void doService() { 
    //This will invoke the async proxy code 
    self.doAsync(); 
} 

@Async 
public void doAsync() { 
    //Async logic here... 
} 
0

Puede utilizar @EnableAsync en su servicio ...

+0

¿Podría elaborar más su respuesta agregando algunos detalles a la solución que proporciona? – abarisone

+0

@alireza alallah: Agregue algunos detalles a la respuesta – Jayan

+0

, consulte http://www.baeldung.com/spring-async –

Cuestiones relacionadas