☁️ infra/✉️ MQ

RabbitMQ + Spring Boot(2)

beomsic 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