小编典典

Spring Boot-在部署时启动后台线程的最佳方法

spring-boot

我在Tomcat 8中部署了一个Spring Boot应用程序。启动该应用程序时,我想在Spring
Autowires具有某些依赖项的后台启动一个工作线程。目前我有这个:

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan
public class MyServer extends SpringBootServletInitializer {

    public static void main(String[] args) {
        log.info("Starting application");
        ApplicationContext ctx = SpringApplication.run(MyServer.class, args);
        Thread subscriber = new Thread(ctx.getBean(EventSubscriber.class));
        log.info("Starting Subscriber Thread");
        subscriber.start();
    }

在我的Docker测试环境中,它工作得很好-但是当我将它部署到Tomcat 8中的Linux(Debian Jessie,Java
8)主机上时,我再也看不到“正在启动订户线程”消息(并且该线程未启动)。


阅读 1254

收藏
2020-05-30

共1个答案

小编典典

将应用程序部署到非嵌入式应用程序服务器时,不会调用main方法。启动线程的最简单方法是从bean构造函数中执行。关闭上下文时清理线程也是一个好主意,例如:

@Component
class EventSubscriber implements DisposableBean, Runnable {

    private Thread thread;
    private volatile boolean someCondition;

    EventSubscriber(){
        this.thread = new Thread(this);
        this.thread.start();
    }

    @Override
    public void run(){
        while(someCondition){
            doStuff();
        }
    }

    @Override
    public void destroy(){
        someCondition = false;
    }

}
2020-05-30