[RabbitMQ] Scheduling Consumer ON/OFF
이번 글에서는 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();
});
}
}
위의 소스를 해석해보면 아래와 같습니다.
- RabbitListenerEndpointRegistry.getListenerContainers()를 통해 consumer application의 모든 rabbitlistener endpoint을 확인합니다.
- stopAll()를 통해 매일 23시에는 모든 rabbitlistner endpoint를 OFF 합니다.
- 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
'Spring Cloud > RabbitMQ' 카테고리의 다른 글
[RabbitMQ #1] Rabbit MQ 설치 (0) | 2022.05.24 |
---|---|
[AMQP] AMQP(Advanced Message Queuing Protocol) (0) | 2022.05.24 |
[RabbitMQ] Request / Reply with Spring Boot (0) | 2021.11.03 |
[RabbitMQ] Message Order & Multiple Message Type (0) | 2021.11.03 |
[RabbitMQ] Jackson2JsonMessageConvertor (0) | 2021.11.03 |
[RabbitMQ] RabbitMQ Structure 생성하기 (0) | 2021.11.03 |
[RabbitMQ] RabbitMQ vs Kafka (0) | 2021.11.03 |
[RabbitMQ] Retry Mechanism with Spring Boot (0) | 2021.11.03 |