Bean生命周期管理Spring Boot

6

我目前正试图将一个Spring Boot应用程序部署到外部Tomcat实例中,但在如何最好地管理某些东西的实例化方面遇到了一些问题。

按照当前的结构,我的代码大致如下:

public class MyClass extends SpringBootServletInitializer{


@Bean
public ThreadPool pool(){
    return new ThreadPool();
}

@Bean
public BackgroundThread setupInbox() {
    BackgroundThread inbox = new BackgroundThread(pool());
    inbox.start();
    return inbox;
}

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(MyClass.class);
}

public static void main(String[] args) throws Exception {
    SpringApplication.run(MyClass.class, args);
}


}

其中BackgroundThread是一个线程,它正在监听AMQP类型的消息队列以获取新的作业。我知道Spring提供了一些RabbitMQ的方法来执行此操作,但我们没有使用Rabbit,因此这并没有帮助。

部署此*.war文件的整个目的是通过消息传递将某些功能暴露给外部。因此,我的问题是在Spring的生命周期内实例化、启动和销毁BackgroundThread的最佳方法是什么?XML配置?


你是否想要监听一些Spring上下文生命周期事件并在其上进行线程管理? - jahra
1个回答

6

文档中提到:

JSR-250的@PostConstruct和@PreDestroy注解通常被视为在现代Spring应用程序中接收生命周期回调的最佳实践。使用这些注解意味着您的bean不会与Spring特定的接口耦合。

有关详细信息,请参见第7.9.8节“@PostConstruct和@PreDestroy”

这些注释应该放在一些init和cleanup方法上:

@PostConstruct
public void initAfterStartup() {
    ...
}

@PreDestroy
public void cleanupBeforeExit() {
    ...
}

另外还有以下几点:

每个SpringApplication都会向JVM注册一个关闭挂钩,以确保ApplicationContext在退出时能够优雅地关闭。可以使用所有标准的Spring生命周期回调(例如DisposableBean接口或@PreDestroy注释)。

此外,如果bean希望在应用程序结束时返回特定的退出码,则可以实现org.springframework.boot.ExitCodeGenerator接口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接