☁️ 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/