我在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)主机上时,我再也看不到“正在启动订户线程”消息(并且该线程未启动)。
将应用程序部署到非嵌入式应用程序服务器时,不会调用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; } }