ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RabbitMQ + Spring Boot(2)
    ✉️ MQ 2023. 1. 5. 18:56

    이번엔 Message Sender를 만들고 RestController로 메시지를 보낼 수 있는 API를 만들어

    API를 호출하고 메시지 수신을 확인해보고자 한다.

     

    📤 RabbitTemplate을 사용해서 메시지 전송하기


    Rabbit Template의 메서드를 이용하여 메시지를 전달할 수 있다.

     

    RabbitTemplate Bean 설정

    Configuration 클래스에 RabbitTemplate 을 빈으로 설정해준다.

      @Bean
      public ConnectionFactory getConnectionFactory() {
        ConnectionFactory connectionFactory = new CachingConnectionFactory(RABBITMQ_HOST, RABBITMQ_PORT);
        ((CachingConnectionFactory) connectionFactory).setUsername(RABBITMQ_USERNAME);
        ((CachingConnectionFactory) connectionFactory).setPassword(RABBITMQ_PASSWORD);
        return connectionFactory;
      }
    
      ...
    
      @Bean
      public Jackson2JsonMessageConverter getMessageConverter() {
        return new Jackson2JsonMessageConverter();
      }
    
      @Bean
      public RabbitTemplate rabbitTemplate() {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(getConnectionFactory());
        rabbitTemplate.setMessageConverter(getMessageConverter());
        return rabbitTemplate;
      }

     

    RabbitTemplate 코드

    // RabbitTemplate 
    
    // send message
    @Override
    public void send(Message message) throws AmqpException
    
    @Override
    public void send(String routingKey, Message message) throws AmqpException 
    
    @Override
    public void send(String routingKey, Message message, CorrelationData correlationData) throws AmqpException 
    
    @Override
    public void send(final String exchange, final String routingKey, final Message message) throws AmqpException
    
    @Override
    public void send(final String exchange, final String routingKey,
    	final Message message, @Nullable final CorrelationData correlationData)throws AmqpException 
    
    // send message converted from objects
    // 객체로부터 변환된 메시지 전송
    @Override
    public void convertAndSend(Object object) throws AmqpException 
      
    @Override
    public void convertAndSend(String routingKey, final Object object) throws AmqpException 
    
    @Override
    public void convertAndSend(String routingKey, final Object object, CorrelationData correlationData)
    		throws AmqpException
    
    ...

     

    RabbitTemplate.send() 로 메시지 전송

    • 기본값으로 설정된 exchange, routing-key에 따라 전달된다

     

    @Service
    public class RabbitSenderService {
    
      @Autowired
      private RabbitTemplate rabbitTemplate;
    
      public void sendMessage(SampleMessage sampleMessage) {
        log.info("RabbitSenderService send {}", sampleMessage.getContent());
        MessageConverter converter = rabbitTemplate.getMessageConverter();
        MessageProperties props = new MessageProperties();
        Message message = converter.toMessage(sampleMessage, props);
        rabbitTemplate.send(message);
      }
      ...
    }

     

    RabbitTemplate.convertAndSend() 로 메시지 전송

    • 메시지 변환 후 전송

     

    기본적인 메시지 변환은 SimpleMessageConverter로 수행된다.

    스프링은 RabbitTemplate에서 사용할 수 있는 여러 개의 메시지 변환기를 제공

    • Jackson2JsonMessageConverter
    • MarshallingMessageConverter
    • 등등

     

    @Service
    public class RabbitSenderService {
    
      @Autowired
      private RabbitTemplate rabbitTemplate;
    
      @Autowired
      private Queue queue;
    
      public void sendConvertMessage(SampleMessage sampleMessage) {
        rabbitTemplate.convertAndSend(queue.getName(), sampleMessage);
        log.info("RabbitSenderService convert and send {}", sampleMessage.getContent());
      }
    }

     

    메시지 속성 설정

    헤더를 설정해 줄 수 있다.

    MessageProperties를 사용하지 않고 MessagePostProcessor에서 해준다.

    public void sendSetMessageProperty(SampleMessage sampleMessage) {
        rabbitTemplate.convertAndSend(queue.getName(), sampleMessage,
            new MessagePostProcessor() {
              @Override
              public Message postProcessMessage(Message message) throws AmqpException {
                MessageProperties props = message.getMessageProperties();
                props.setHeader("X_ORDER_SOURCE", "WEB");
                return message;
              }
            });
        log.info("RabbitSenderService convert and send message, set message property {}", sampleMessage.getContent());
      }

     

    Controller 사용

    @RestController
    @RequestMapping("/api/v1/rabbitmq")
    public class RabbitController {
    
      private final RabbitSenderService rabbitSenderService;
    
      public RabbitController(RabbitSenderService rabbitSenderService) {
        this.rabbitSenderService = rabbitSenderService;
      }
    
      @PostMapping("/")
      public void sendMessage(@RequestBody SampleMessage message) {
        rabbitSenderService.sendMessage(message);
      }
    
      @PostMapping("/convert")
      public void convertAndSendMessage(@RequestBody SampleMessage message) {
        rabbitSenderService.sendConvertMessage(message);
      }
    
    }
    
    • 해당 API를 사용해 메시지를 전송할 수 있다.

     

    실행

     

    참고자료

    https://docs.spring.io/spring-amqp/api/org/springframework/amqp/rabbit/core/RabbitTemplate.html

    https://docs.spring.io/spring-amqp/docs/current/reference/html/

    https://wecandev.tistory.com/50

    https://www.springcloud.io/post/2022-03/messaging-using-rabbitmq-in-spring-boot-application/#rabbitmqsenderjava

    '✉️ MQ' 카테고리의 다른 글

    [RabbitMQ] 한 Queue에서 여러 타입의 Message 처리  (0) 2023.01.05
    Rabbit MQ + Spring Boot(1)  (1) 2023.01.04
    Rabbit MQ  (0) 2023.01.04
    Message Queue 란❓  (0) 2023.01.04

    댓글

Designed by Tistory.