我想在tomcat服务器启动时启动守护进程邮件服务线程.所以我用@Async注释注释了一个方法.
我有一个实现ApplicationListener接口的类.当我从这个类中调用async方法时,它不会异步启动并阻止当前线程.而当我从spring控制器类中调用异步方法时,它永远不会阻止并异步启动.
为什么async方法从一个类而不是另一个类成功执行?
我做错了什么,如何在服务器启动时执行异步方法?
提前致谢.
编辑:嗨,我试过使用InitializingBean接口,@PostConstruct,init方法来调用我的异步方法,但是它从未执行过.然后我意识到,我的默认lazy-init是真的,所以我的lazy-init为我的InitializingBean为false.现在它执行我的asnyc方法,但它阻止当前线程,现在还有一个问题,我正在面对的是我的服务器没有优雅地停止,但是我必须强制停止我的服务器.
解决方法
首先你不需要实现ApplicationListener接口.你正在使用
Spring – 应用程序的上下文就足够了.
第二,你正在谈论Spring @Async,这意味着你的任务应该从应用程序上下文启动,而控制器bean是其中的一部分.
你需要确保你有<注释驱动>在你的spring xml文件中.
您可以在@PostConstruct函数中启动您的任务:
@Component public class SampleBeanImpl implements SampleBean { @Async void doSomething() { … } } @Component public class SampleBeanInititalizer { @Autowired private final SampleBean bean; @PostConstruct public void initialize() { bean.doSomething(); } }