2010-10-30 16 views
12

Ich benutze @Scheduled und es hat gut funktioniert, aber kann nicht die @ Async funktioniert. Ich habe es viele Male getestet und es scheint, dass es meine Methode asynchron macht. Gibt es noch etwas anderes, Konfiguration oder Parameter, die ich vermisse? Ich habe eine Klasse, die zwei Methoden hat eine, die mit @Scheduled markierte Methode, führt aus und ruft die zweite auf, die mit @ Async markiert wurde.@Async funktioniert nicht für mich

Hier ist meine 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" /> 

Dank.

+0

ist das Problem? – Bozho

+0

sollten Sie weitere Informationen bereitstellen. (Codeschnipsel etc) – onigunn

+0

haben keine Ausnahme es macht die Methode nur nicht asynchron. Irgendeine spezielle Konfiguration, um es zum Laufen zu bringen? das ist meine Frage, werde meine Konfiguration posten, um mehr über mein env zu erzählen. Ich habe bereits mein @Scheduling funktioniert gut. – Thiago

Antwort

32

Wenn Sie Ihre @ Async-Methode von einer anderen Methode im selben Objekt aufrufen, umgehen Sie wahrscheinlich den asynchronen Proxy-Code und rufen einfach Ihre einfache Methode auf, dh innerhalb desselben Threads.

Eine Möglichkeit, dies zu lösen, besteht darin, sicherzustellen, dass Ihr Aufruf der @ Async-Methode von einem anderen Objekt stammt. Siehe Anmerkungen am Ende dieses Artikels: http://groovyjavathoughts.blogspot.com/2010/01/asynchronous-code-with-spring-3-simple.html

Aber es wird chaotisch Dinge wie das zu tun, so konnte man nur die Taskscheduler autowire, einpacken Ihre Methode in einem Runnable und führen Sie es selbst.

+0

Sicherlich eine leichte Sache zu verpassen. –

3

Ich hatte ein ähnliches Problem. Und ich habe viel Zeit investiert, um es zu reparieren.

Wenn Sie feder Kontext 3.2 Sie auch @EnableAsync auf die Klasse hinzufügen müssen, wo Sie die Methode Service @Async

Werfen Sie einen Blick auf http://spring.io/guides/gs/async-method/#initial

kommentierte nennen Ich hoffe, dass es dir hilft.

3

Dies ist eine ergänzende Antwort auf die akzeptierte. Sie können eine asynchrone Methode in Ihrer eigenen Klasse aufrufen, aber Sie müssen eine selbstreferenzielle Bean erstellen.

Der einzige Nebeneffekt hier ist, dass Sie nicht beliebigen asynchronen Code innerhalb des Konstruktors aufrufen können. Es ist eine gute Möglichkeit, Ihren Code an der gleichen Stelle zu halten.

@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

Sie @EnableAsync in Ihrem Dienst verwenden können ...

+0

Könnten Sie bitte Ihre Antwort näher ausführen, indem Sie der von Ihnen bereitgestellten Lösung einige Details hinzufügen? – abarisone

+0

@alireza alallah: Bitte fügen Sie einige Details zur Antwort – Jayan

+0

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

Verwandte Themen