[RabbitMQ] Scheduling Consumer ON/OFF

2021. 11. 3. 11:44 Spring Cloud/RabbitMQ

이번 글에서는 Spring Boot의 @Scheduled를 사용해 Consumer를 ON/OFF 해보도록 하겠습니다.

1. @Scheduled

먼저 spring boot에서 사용할 수 있는 @Scheduled의 종류를 살펴보겠습니다.

1-1) @Scheduled(fixedDelay = N)

이전 execution으로부터의 delay 시간을 의미합니다. 예를 들어 다음 execution이 실행되는 시간은 이전 execution이 완료된 후 N 시간이 지난이후입니다.

1-2) @Scheduled(fixedRate = N)

어플리케이션이 실행된후 매 N 시간마다 execution을 실행합니다. 예를 들어 0초에 이전 execution이 실행되었다면 0+N 시간 후 다음 execution이 실행됩니다.

1-3) @Scheduled(cron="0 * * * * *")

특정 시간에 주기적으로 execution을 실행합니다. 순서대로 "초 분 시 일 월 요일 연도"를 입력하면 됩니다.

0~59 | 0~59 | 0~23 | 1~31 | 1~12 | 0~6 | 생략가능

2. ON/OFF Consumer

이제 본론으로 돌아와서, 특정시간에는 메세지를 소비하면 안되는 환경을 가정해보도록 하겠습니다.

예를 들어 아래 그림처럼, Payment App은 24시간 운영되지만 payment message를 사용해 transation을 처리하는 Ledger App은 특정시간(23~24시)에는 메세지를 처리하면 안되는 경우일때는 어떻게 해야될까요?

단순히 Ledger App을 특정시간에 꺼버리는 것은 비효율적이며, 고객들의 불만을 초래할 수 있습니다.

 

 

따라서 위의 경우에는 특정시간(23시)에 메시지 Listner만 OFF 한뒤, 다시 특정시간(24시)에 메시지 Listner를 ON 하는 방법으로 간단히 문제를 해결할 수 있습니다.

Spring boot의 @Scheduled를 사용하면 위의 기능을 아래와 같이 손쉽게 구현할 수 있습니다.

@Service
@EnableScheduling
public class RabbitmqScheduler {

    //@Autowired
    private RabbitListenerEndpointRegistry registry = new RabbitListenerEndpointRegistry();

    private static final Logger log = LoggerFactory.getLogger(RabbitmqScheduler.class);

    @Scheduled(cron = "0 0 23 * * ?")
    public void stopAll(){
        registry.getListenerContainers().forEach(c ->{
            log.info("Stopping container : {} ", c);
            c.stop();
        });
    }

    @Scheduled(cron = "1 0 0 * * ?")
    public void startAll(){
        registry.getListenerContainers().forEach(c ->{
            log.info("Stopping container : {} ", c);
            c.start();
        });
    }
}

위의 소스를 해석해보면 아래와 같습니다.

  1. RabbitListenerEndpointRegistry.getListenerContainers()를 통해 consumer application의 모든 rabbitlistener endpoint을 확인합니다.
  2. stopAll()를 통해 매일 23시에는 모든 rabbitlistner endpoint를 OFF 합니다.
  3. startAll()를 통해 매일 24시에는 모든 rabbitlistner endpoint를 ON 합니다.

참고 자료 : https://www.udemy.com/course/rabbitmq-java-spring-boot-for-system-integration/

출처 : https://minholee93.tistory.com/entry/RabbitMQ-Scheduling-Consumer-ONOFF