2010-10-30 5 views
12

Я использую @Scheduled, и он отлично работает, но не может заставить @Async работать. Я тестировал его много раз, и кажется, что он делает мой метод асинхронным. Есть ли какая-либо другая вещь, конфигурация или параметр, который мне не хватает? У меня есть один класс, который имеет два метода один, метод, отмеченный с помощью @Scheduled, выполняет и вызывает второй, который был помечен @Async.@Async не работает для меня

Вот мой конфиг:

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

Спасибо.

+0

проблема? – Bozho

+0

вы должны предоставить дополнительную информацию. (фрагменты кода и т. д.) – onigunn

+0

не имеет никакого исключения, он просто не делает метод асинхронным. Любая особенная конфигурация, чтобы заставить ее работать? это мой вопрос, опубликует мой конфиг, чтобы рассказать больше о моем env. У меня уже есть мой рабочий стол @Scheduled. – Thiago

ответ

32

Как вы называете свой метод @Async другим методом в одном и том же объекте, вы, вероятно, обходите прокси-код async и просто вызываете свой простой метод, то есть внутри одного потока.

Один из способов решения этого вопроса - убедиться, что ваш вызов метода @Async выполняется из другого объекта. См. Комментарии в конце этой статьи: http://groovyjavathoughts.blogspot.com/2010/01/asynchronous-code-with-spring-3-simple.html

Но это становится грязным, делая такие вещи, поэтому вы можете просто автонастроить TaskScheduler, завернуть свой метод в Runnable и выполнить его самостоятельно.

+0

Конечно, легко пропустить. –

3

У меня была проблема, подобная этому. И я потратил много времени, чтобы исправить это.

Если вы используете весна-контекст 3,2, вам также необходимо добавить @EnableAsync на классе, где вы называете службы метод аннотированный @Async

Посмотрите на http://spring.io/guides/gs/async-method/#initial

Надеюсь, это поможет вам.

3

Это дополнительный ответ на принятый. Вы можете вызвать метод async в своем классе, но вам нужно создать самореферентный компонент.

Единственный побочный эффект здесь в том, что вы не можете вызывать любой асинхронный код внутри конструктора. Это хороший способ сохранить код в одном месте.

@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

Вы можете использовать @EnableAsync в службе ...

+0

Не могли бы вы подробнее рассказать о своем решении, добавив некоторые детали к вашему решению? – abarisone

+0

@alireza alallah: Пожалуйста, добавьте некоторые детали ответа – Jayan

+0

, пожалуйста, см. Http://www.baeldung.com/spring-async –

Смежные вопросы