복붙노트

[SPRING] Spring ApplicationListener가 webapp에서 두 번 실행됩니다.

SPRING

Spring ApplicationListener가 webapp에서 두 번 실행됩니다.

기본 사용자 정보 데이터를로드하기 때문에 webapp 시작 당 한 번만 실행해야하는 응용 프로그램 수신기가 있습니다.

public class DefaultUsersDataLoader implements ApplicationListener<ContextRefreshedEvent> {
  @Override
  @Transactional
  public void onApplicationEvent(ContextRefreshedEvent e) {...}
}

어쨌든, 두 번 실행됩니다 : 응용 프로그램 시작시 및 첫 번째 요청이 서버에 도착할 때. 왜 이런 일이 일어나고 어떻게 막을 수 있습니까?

해결법

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

    1.일반적으로 Spring MVC 애플리케이션에는 ContextLoaderListener와 DispatcherServlet이 둘 다있다. 두 컴포넌트는 모두 자신의 ApplicationContext를 생성하며, 둘 다 ContextRefreshedEvent를 발생시킨다.

    일반적으로 Spring MVC 애플리케이션에는 ContextLoaderListener와 DispatcherServlet이 둘 다있다. 두 컴포넌트는 모두 자신의 ApplicationContext를 생성하며, 둘 다 ContextRefreshedEvent를 발생시킨다.

    DispatcherServlet은 ContextLoaderListener에 의해 부모로 생성 된 ApplicationContext를 사용합니다. 하위 컨텍스트에서 시작된 이벤트는 상위 컨텍스트로 전파됩니다.

    이제 루트 컨텍스트 (ContextLoaderListener에 의해로드 된 컨텍스트)에 ApplicationListener 가 정의되어 있으면 이벤트를 두 번 받게됩니다.

  2. ==============================

    2.Listener 클래스의 메서드에 @EventListener 주석을 달지 마십시오.

    Listener 클래스의 메서드에 @EventListener 주석을 달지 마십시오.

  3. from https://stackoverflow.com/questions/27859182/spring-applicationlistener-gets-fired-twice-on-webapp by cc-by-sa and MIT license