-
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/
'✉️ 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