복붙노트

[SPRING] Spring webapp - 응용 프로그램 중지시 스레드 종료

SPRING

Spring webapp - 응용 프로그램 중지시 스레드 종료

다음과 같이 Spring의 ApplicationListener 인터페이스를 사용하여 ScheduledExecutorService를 인스턴스화합니다.

@Component
public class ExecutorsStart implements ApplicationListener<ContextRefreshedEvent> {

    private ScheduledExecutorService executor;

@Autowired
Scheduler scheduler;

@Override
public void onApplicationEvent(final ContextRefreshedEvent event) {
    executor = Executors.newSingleThreadScheduledExecutor();
    scheduler.init();
    int delay = 10;
    int period = 60;// repeat every 1 minutes.
    executor.scheduleAtFixedRate(scheduler, delay, period, TimeUnit.SECONDS);
}

현재 Tomcat은 내가 실행할 때 ./shutdown.sh 메시지와 함께 깨끗하게 종료되지 않습니다.

The web application [/foo] appears to have started a thread named [pool-1-thread-1] but has failed to stop it

그리고 이것은 내가 ScheduledExecutorService를 멈추기위한 코드를 아직 작성하지 않았기 때문인 것으로 보인다.

내 질문입니다 :이 환경에서 어떻게 제대로 수행되어야합니까?

나는 ContextStoppedEvent가 있다는 것을 알아 차렸다. 그래서 그것을 위해 리스너를 구현했다 :

@Component
public class ExecutorsStop implements ApplicationListener<ContextStoppedEvent> {

@Autowired
ExecutorsStart executorsStart;

@Override
public void onApplicationEvent(final ContextStoppedEvent event) {
    executorsStart.executor.shutdownNow();
}

하지만 Tomcat이 종료 될 때이 이벤트 핸들러가 호출되지 않는 것 같습니다.

이 방법을 잘못 구현 했나요? 아니면 완전히이 방법을 사용하고 있습니까?

해결법

  1. ==============================

    1.ContextClosedEvent를 찾고 있습니다.

    ContextClosedEvent를 찾고 있습니다.

    @Component
    public class ExecutorsStop implements ApplicationListener<ContextClosedEvent> {
    
        @Autowired
        ExecutorsStart executorsStart;
    
        @Override
        public void onApplicationEvent(final ContextClosedEvent event) {
            System.out.println("Stopped: " + event);
        }
    }
    

    Servlet 컨테이너가 종료되면 다양한 ServletContextListener에서 contextDestroyed (..)를 호출하고 Servlet 인스턴스에서 destroy ()를 호출합니다. ContextLoaderListener와 DispatcherServlet은 각각 ApplicationContext에서 close ()를 호출합니다.

  2. from https://stackoverflow.com/questions/22650569/spring-webapp-shutting-down-threads-on-application-stop by cc-by-sa and MIT license