Подтвердить что ты не робот

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

Спасибо.

4b9b3361

Ответ 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 в своей службе...