@Async不适合我

时间:2010-10-30 21:16:22

标签: java spring

我正在使用@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" />

感谢。

4 个答案:

答案 0 :(得分:35)

当您从同一对象中的另一个方法调用@Async方法时,您可能绕过异步代理代码并只调用普通方法,即在同一个线程内。

解决此问题的一种方法是确保调用@Async方法来自另一个对象。请参阅本文末尾的评论: http://groovyjavathoughts.blogspot.com/2010/01/asynchronous-code-with-spring-3-simple.html

但是这样做很麻烦,所以你可以自动装配TaskScheduler,将你的方法包装在Runnable中并自己执行。

答案 1 :(得分:4)

这是对已接受的答案的补充答案。您可以在自己的类中调用异步方法,但必须创建自引用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...
}

答案 2 :(得分:3)

我遇到了类似的问题。我花了很多时间来解决它。

如果您使用 spring-context 3.2 ,则还需要在调用方法服务注释 @Async @EnableAsync >

查看http://spring.io/guides/gs/async-method/#initial

我希望它会帮助你。

答案 3 :(得分:0)

您可以在服务中使用@EnableAsync ...