Spring

Spring Boot에서 애플리케이션 이벤트를 게시하기 위해 이벤트 리스너를 동기식으로 만드는 방법

기록만이살길 2021. 3. 15. 08:04
반응형

Spring Boot에서 애플리케이션 이벤트를 게시하기 위해 이벤트 리스너를 동기식으로 만드는 방법

1. 질문(문제점):

응용 프로그램 이벤트 (MyEvent)를 게시하는 방법이 있고 "게시 완료"를 기록하고 있습니다. 내가 가진 문제는 로그 문이 먼저 실행되고 MyEvent 리스너가 호출된다는 것입니다. 실행 순서가 다음과 같은지 어떻게 확인합니까?

  1. 이벤트 게시

  2. 이벤트 듣기

  3. 로그 문 실행 [아래 코드 참조]

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void method() {
    
           //save something in db
          applicationEventPublisher.publishEvent(new MyEvent(...params));
          log.info("done publishing");
        });
    
      }
    
      @TransactionalEventListener
      @Order(2)
      public void handle(MyEvent myEvent) {
        //do something
      }
    
    

2. 해결방안:

@TransactionalEventListener현재의 트랜잭션 (transaction)에 바인딩 이벤트 리스너입니다. 주어진 단계에서 이벤트를 실행하며 기본값은 AFTER_COMMIT입니다.

따라서 귀하의 경우 이벤트는 method(). 따라서 이벤트가 시작되지만 아직 해당 리스너에 의해 실행되지는 않습니다. 따라서 당신이 보는 행동.

실제로 이벤트는 기본적으로 이미 비동기식이 아닌 동기식으로 전달됩니다 (표시되는 동작으로 인해 예상 됨).

당신이 이벤트를 실행하려면 직접 정기적으로 사용하는 @EventListener대신의를 @TransactionalEventListener.

@EventListener
@Order(2)
public void handle(MyEvent myEvent) {
  //do something
}

이제 코드가 예상하고 원하는대로 작동합니다.

65700617
반응형