我正在使用@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" />
感谢。
答案 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
...