안녕하세요 오늘은 Road To MQ 여섯번째 아티클인 RabbitMQ로 메세징 - Exchange의 Topic (Listener)입니다!
지난 아티클 에서 WebSocket + stomp + RabbitMQ의 Topic을 구현해 보았는데요
RabbitMQ에서 제공해주는 @RabbitListener 를 사용해주면 쉽게 메세지를 수신할 수 있습니다!
시나리오는 저번 아티클 과 같습니다!
exchange와 queue도 동일 하구요!
저번 코드에서 변경된 점은 stompConfig의 제거와 Controller 구조 변경이 있습니다!
@RestController
@Slf4j
@RequiredArgsConstructor
public class RabbitPublishController {
private final RabbitTemplate rabbitTemplate;
@PostMapping("/send/sales/staff")
public String sendSalesStaff(@RequestBody String message) {
log.info("-------log-------");
log.info("sales부서의 staff에게 {" + message + "} 라는 메시지를 보냅니다.");
log.info("-------log-------");
rabbitTemplate.convertAndSend("JunWooCompany", "sales.staff", message);
return message;
}
@PostMapping("/send/sales/director")
public String sendSalesDirector(@RequestBody String message) {
log.info("-------log-------");
log.info("sales부서의 director에게 {" + message + "} 라는 메시지를 보냅니다.");
log.info("-------log-------");
rabbitTemplate.convertAndSend("JunWooCompany", "sales.director", message);
return message;
}
}
메세지를 발행하는 Controller 입니다.
REST API 방식으로도 접근할 수 있습니다!여기서는
- sales 부서의 staff
- sales 부서의 director
에게 메세지를 발행 할 수 있도록 하였습니다!
@Slf4j
@Controller
@RequiredArgsConstructor
public class RabbitConsumeController {
@RabbitListener(queues = "sales.staff")
public void salesStaff(String message) {
log.info("-------log : 저는 sales부서의 staff의 메세지를 수집합니다-------" +
"\nsales부서의 staff에게 보낸 {" + message + "} 라는 메시지를 받았습니다." +
"\n-------log-------");
}
@RabbitListener(queues = "sales.director")
public void salesDirector(String message) {
log.info("-------log : 저는 sales부서의 director의 메세지를 수집합니다-------" +
"\nsales부서의 director에게 보낸 {" + message + "} 라는 메시지를 받았습니다." +
"\n-------log-------");
}
@RabbitListener(queues = "Allstaff")
public void allStaff(String message) {
log.info("-------log : 저는 모든 staff의 메세지를 수집합니다-------" +
"\n모든 staff에게 보낸 {" + message + "} 라는 메시지를 받았습니다." +
"\n-------log-------");
}
@RabbitListener(queues = "Allsales")
public void allSales(String message) {
log.info("-------log : 저는 sales부서의 모든 메세지를 수집합니다-------" +
"\nsales부서의 staff에게 보낸 {" + message + "} 라는 메시지를 받았습니다." +
"\n-------log-------");
}
}
메세지를 수신하는 Controller 입니다.
RabbitListener 어노테이션으로 메세지를 감지하며 queues에는 생성된 queue의 이름을 작성하면 됩니다!여기서는
- sales 부서의 staff
- sales 부서의 director
- sales 부서의 모든 메세지
- staff 직급의 모든 메세지
에게 오는 메세지를 수신할 수 있도록 하였습니다!
로그가 잘 찍힙니다!🔫🔫
RabbitMQ는 패턴 매칭을 통한 기능이 강력한 Broker 였습니다!
등급별, 부서별 등 분류가 되는 객체들에 대해서 대규모 처리를 할 때 효율이 좋을 것 같다고 생각합니다.