如何在Spring中启动服务器启动时的守护进程

Dhe*_*wal 10 java spring

我想在tomcat服务器启动时启动一个守护进程邮件服务线程.所以,我用@Async注释注释了一个方法.

我有一个实现ApplicationListener接口的类.当我从这个类调用我的异步方法时,它永远不会异步启动并阻塞当前线程.当我从spring控制器类调用我的异步方法时,它永远不会阻塞并异步启动.

为什么异步方法从一个类成功执行而不是从另一个类执行?

我做错了什么以及如何在服务器启动时执行我的异步方法?

提前致谢.

编辑:嗨大家好,我尝试使用InitializingBean接口,@ PostConstruct,init-method方法来调用我的异步方法,但它从未执行过.然后我意识到,我的默认lazy-init是真的,所以我将我的InitializingBean的lazy-init设为false.现在它执行我的asnyc方法,但它阻止了当前线程,现在还有一个问题,我面临的是我的服务器没有正常停止,但我必须强行停止我的服务器.

dan*_*nik 13

首先,您不需要实现ApplicationListener接口.您正在使用Spring - 应用程序上下文就足够了.

其次,你在谈论Spring @Async,这意味着你的任务应该从Application Context启动,而Controller bean也是它的一部分.

您需要确保<annotation-driven>在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();
  }
}
Run Code Online (Sandbox Code Playgroud)