@Async не работает для меня
Я использую @Scheduled, и он работает нормально, но не может заставить @Async работать. Я тестировал его много раз, и кажется, что он делает мой метод асинхронным. Есть ли какая-либо другая вещь, конфигурация или параметр, который мне не хватает? У меня есть один класс, который имеет два метода один: метод, помеченный с помощью @Scheduled, выполняет и вызывает второй, который был помечен @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" />
Спасибо.
Ответы
Ответ 1
Как вы вызываете свой метод @Async из другого метода в одном и том же объекте, вы, вероятно, обходите прокси-код async и просто вызываете свой простой метод, то есть внутри одного потока.
Один из способов решения этого вопроса - убедиться, что ваш вызов метода @Async принадлежит другому объекту. См. Комментарии в конце этой статьи:
http://groovyjavathoughts.blogspot.com/2010/01/asynchronous-code-with-spring-3-simple.html
Но это становится бесполезным, делая такие вещи, поэтому вы можете просто автозапускать TaskScheduler, завершать свой метод в Runnable и выполнять его самостоятельно.
Ответ 2
У меня была проблема, подобная этому. И я потратил много времени, чтобы исправить это.
Если вы используете spring -context 3.2, вам также нужно добавить @EnableAsync в класс, где вы вызываете метод service аннотированный @Async
Взгляните на http://spring.io/guides/gs/async-method/#initial
Я надеюсь, что это поможет вам.
Ответ 3
Это дополнительный ответ на принятый. Вы можете вызвать метод async в своем классе, но вам нужно создать самореферентный bean.
Единственным побочным эффектом здесь является то, что вы не можете вызывать любой асинхронный код внутри конструктора. Это хороший способ сохранить код в одном месте.
@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...
}
Ответ 4
Вы можете использовать @EnableAsync
в своей службе...