2010-10-30 16 views
12

Sto usando @Scheduled e ha funzionato correttamente, ma non riesco a ottenere il funzionamento di @Async. L'ho provato molte volte e sembra che stia rendendo il mio metodo asincrono. C'è qualche altra cosa, configurazione o parametro che mi manca? Ho una classe che ha due metodi uno, il metodo contrassegnato con @Scheduled, esegue e chiama il secondo che è stato contrassegnato con @Async.@Async non funziona per me

Ecco la mia configurazione:

<!-- 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" /> 

Grazie.

+0

è il problema? – Bozho

+0

dovresti fornire ulteriori informazioni. (frammenti di codice ecc.) – onigunn

+0

non hanno alcuna eccezione, semplicemente non rende il metodo asincrono. Qualche configurazione speciale per farlo funzionare? questa è la mia domanda, pubblicherò la mia configurazione per dire di più sul mio env. Ho già un buon funzionamento del mio @Scheduled. – Thiago

risposta

32

Come stai chiamando il metodo @Async da un altro metodo nello stesso oggetto, probabilmente stai bypassando il codice proxy asincrono e semplicemente chiamando il tuo metodo semplice, cioè all'interno dello stesso thread.

Un modo per risolvere questo problema è assicurarsi che la chiamata al metodo @Async provenga da un altro oggetto. Vedere i commenti alla fine di questo articolo: http://groovyjavathoughts.blogspot.com/2010/01/asynchronous-code-with-spring-3-simple.html

Ma diventa disordinato di fare cose del genere, quindi si può solo autowire il TaskScheduler, avvolgere il metodo in un Runnable ed eseguire da soli.

+0

Certamente una cosa facile da perdere. –

3

Ho avuto un problema simile a questo. E ho passato molto tempo per sistemarlo.

Se si utilizza primavera-contesto 3.2, è inoltre necessario aggiungere @EnableAsync sulla classe in cui si chiama il servizio di metodo annotato @Async

Date un'occhiata a http://spring.io/guides/gs/async-method/#initial

Spero che ti possa aiutare.

3

Questa è una risposta complementare a quella accettata. È possibile chiamare un metodo asincrono nella propria classe, ma è necessario creare un bean autoreferenziale.

L'unico effetto collaterale qui è che è possibile che non sia in grado di chiamare alcun codice asincrono all'interno del costruttore. È un bel modo per mantenere il codice tutto nello stesso posto.

@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

È possibile utilizzare @EnableAsync nel vostro servizio ...

+0

Potresti per favore elaborare più la tua risposta aggiungendo alcuni dettagli alla soluzione che fornisci? – abarisone

+0

@alireza alallah: aggiungere alcuni dettagli alla risposta – Jayan

+0

per favore vedere http://www.baeldung.com/spring-async –

Problemi correlati