[RabbitMQ] Scheduling 사용하기

2021. 11. 1. 18:03 Spring Cloud/RabbitMQ

이번 글에서는 Spring boot의 Scheduling 기능을 사용해보도록 하겠습니다.

1. Fixed Rate

주기적로 메세지를 생성하기 위해선 Fixed Rate를 사용합니다.

1-1) Producer

@Service
public class RabbitmqProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    private Logger log = LoggerFactory.getLogger(RabbitmqProducer.class) ;

    private int i = 0;

    @Scheduled(fixedRate = 1000)
    public void sendMessage(){
        i++;
        rabbitTemplate.convertAndSend("q.minho", i);
        log.info("send message " + i);
    }
}

먼저 메세지를 생성하는 sendMessage 메서드에 @Scheduled 어노테이션을 입력합니다. 1초에 한번씩 메세지를 Publish 하기위해 fixedRate = 1000을 입력합니다. 이제 이 Producer는 1초에 한번씩 "q.minho" Queue로 메세지를 Publish 합니다.

@Scheduled로 등록된 메서드에 매개변수를 입력받아야되는 경우에는 에러가 발생합니다.

이를 해결하기 위해선 sendMessage에 @Scheduled을 등록하는 것이 아니라, 다른 메서드에 @Scheduled를 달고 주기적으로 sendMessage를 호출하며 파라미터를 넘겨줘야 합니다. 간단히 하기위해 파라미터가 없는 메서드로 작성하겠습니다.

1-2) ProducerApplication

@SpringBootApplication
@EnableScheduling
public class RabbitmqProducerApplication implements CommandLineRunner {


    //@Autowired
    //private RabbitmqProducer rabbitmqProducer;

    public static void main(String[] args) {
        SpringApplication.run(RabbitmqProducerApplication.class, args);
    }

    @Override
    public void run(String... args) {
       // rabbitmqProducer.sendMessage("minho");
    }
}

Producer Application에는 Scheduling 기능을 허용하기 위해 @EnableScheduling 어노테이션을 입력해줍니다. @Scheduled에 등록된 메서드는 알아서 주기적으로 실행되기때문에 run에서 직접 실행할 필요가 없습니다. 따라서 필요없는 RabbitmqProducer와 run 메서드는 주석처리 합니다.

이제 RabbitmqProducerApplication을 실행하면 아래와 같이 1초에 한번씩 메세지를 Publish하는 것을 확인할 수 있습니다.

1-3) Consumer

Consumer는 따로 수정할 필요가 없습니다. Consumer Application을 실행하면, 1초에 한번씩 메세지를 Consume 하는 것을 확인할 수 있습니다.


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

출처 : https://minholee93.tistory.com/entry/RabbitMQ-Scheduling-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0