2016-09-28 3 views
1

Tomcat 8에 스프링 부트 응용 프로그램이 배포되었습니다. 응용 프로그램이 시작될 때 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(); 
    } 

를이 잘 작동합니다 -하지만 난 톰캣 8 내 리눅스 (데비안 제시, 자바 8) 호스트에이를 배포 할 때 나는 "시작 가입자 스레드"을 볼 수 없습니다 메시지 (및 스레드가 시작되지 않음).

+0

당신이 http://docs.spring.io/spring-boot/docs/current/api에 대한 JavaDoc을 읽었다 /org/springframework/boot/context/web/SpringBootServletInitializer.html - 왜'main' 메쏘드를 사용하는지 이해하지 못합니다. –

+0

그래서 Tomcat없이 독립 실행 형 서버로도 실행할 수 있습니다. – Gandalf

+1

그리고'바람둥이 '환경에서이'main'을 무엇이라고 부릅니까? –

답변

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

임 플만 (impelements) 인 콩을 가질 수 있습니다. ApplicationListener<ContextRefreshedEvent>onApplicationEvent은 이미 시작되지 않은 경우 스레드를 시작하기 만합니다. 그런데 ApplicationReadyEvent를 원한다고 생각합니다.

관련 문제