RabbitMQ는 오픈 소스 메시지 브로커 소프트웨어로, 메시지 전송과 수신을 관리하고 조정하는 역할을 하며, 주로 애플리케이션 간의 비동기 통신을 위한 메시지 큐잉을 지원한다.
실습을 위해 프로젝트 준비를 한다.
testImplementation 'org.springframework.amqp:spring-rabbit-test'
spring.application.name=order
message.exchange=market
message.queue.product=market.product
message.queue.payment=market.payment
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
@Configuration
public class OrderApplicationQueueConfig {
@Value("${message.exchange}")
private String exchange;
@Value("${message.queue.product}")
private String queueProduct;
@Value("${message.queue.payment}")
private String queuePayment;
// exchange 생성
@Bean
public TopicExchange exchange() {
return new TopicExchange(exchange);
}
// queue 생성
@Bean
public Queue queueProduct() {
return new Queue(queueProduct);
}
@Bean
public Queue queuePayment() {
return new Queue(queuePayment);
}
// binding 생성 - exchange(market)에서 queue로 연결하는 통로
@Bean
public Binding bindingProduct() {
return BindingBuilder.bind(queueProduct()).to(exchange()).with(queueProduct);
}
@Bean
public Binding bindingPayment() {
return BindingBuilder.bind(queuePayment()).to(exchange()).with(queuePayment);
}
}
@RestController
@RequiredArgsConstructor
public class OrderController {
private final OrderService orderService;
@GetMapping("/order/{id}")
public String order(@PathVariable("id") String id) {
orderService.createOrder(id);
return "Order Complete";
}
}
@Service
@RequiredArgsConstructor
public class OrderService {
@Value("${message.queue.product}")
private String productQueue;
@Value("${message.queue.payment}")
private String paymentQueue;
private final RabbitTemplate rabbitTemplate;
public void createOrder(String orderId) {
rabbitTemplate.convertAndSend(productQueue, orderId);
rabbitTemplate.convertAndSend(paymentQueue, orderId);
}
}
application을 실행하고 요청을 보낸 뒤
http://localhost:{설정된 port번호}
로 접속하여 RabbitMQ의 요청된 Exchange와 Queue를 확인할 수 있다.
현재는 보내질 컨슈머가 없는 상태이기 때문에 queue 내부에 메시지가 쌓여있는 모습
라우팅 키와 큐의 이름을 일치시켜서 바인딩에 혼란을 줄여줄 수 있다.