2016-09-28 2 views
1

У меня есть приложение Spring Boot, развернутое в Tomcat 8. Когда приложение запускается, я хочу запустить рабочий поток в фоновом режиме, который Spring Autowires с некоторыми зависимостями. В настоящее время у меня есть это:Spring Boot - лучший способ начать фоновый поток при развертывании

@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 среде это работает просто отлично - но когда я раскрываю это мой Linux хост (Debian Jessie, Java 8) в Tomcat 8 Я никогда не видел «Запуск подписчика тему» сообщение (и поток не запущен).

+0

Читали ли вы Javadocs для http://docs.spring.io/spring-boot/docs/current/api /org/springframework/boot/context/web/SpringBootServletInitializer.html - Я не понимаю, почему у вас будет метод 'main'. –

+0

Таким образом, он может работать как автономный сервер, без Tomcat. – Gandalf

+1

и что вызывает этот 'main' в среде' tomcat'? –

ответ

4

Главный метод не вызывается при развертывании приложения на сервере без встроенного приложения. Самый простой способ начать поток - это сделать это из конструктора beans. Также хорошая идея, чтобы очистить нить, когда контекст закрыт, например:

@Component 
class EventSubscriber implements DisposableBean, Runnable { 

    private Thread thread; 
    private volatile boolean someCondition; 

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

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

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

} 
+1

Невозможно добавить @Bean на уровне класса, см. Https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Bean.html –

+0

Хорошая точка, Вместо этого я заменил его на '@ Component', хотя вы можете зарегистрировать компонент, но вы действительно хотите. – Magnus

0

У вас может быть bean, который imeklements ApplicationListener<ContextRefreshedEvent> Это будет onApplicationEvent будет называться только начать свою нить там, если он еще не был запущен. Я думаю, вы хотите, чтобы ApplicationReadyEvent кстати.

Смежные вопросы