개발자의 서재
Springboot + RabbitMQ 연동 본문
목적
- springBoot와 RabbitMQ 연동
- RabbitMQ를 통해 문자열과 객체 sender, receive 만들어보기
개발순서
- Local에 docker를 통해서 RabbitMQ 설치
- 문자열 sender, receiver 개발, 테스트
- 객체 sender, receiver 개발, 테스트
메시지 흐름
- Sender 에서 Receiver로 메세지 전송
- Receiver 에서 메세지 수신
- Receiver 에서 메시지 수신 후 Sender로 메세지 리턴
- Sender 에서 리턴받은 메세지 수신
소스(센더) : https://github.com/ironmask431/springboot-rabbitMq-sender
소스(리시버): https://github.com/ironmask431/springboot-rabbitMq-receiver
참고영상 : https://www.youtube.com/watch?v=80y2C54KPxg
* rabbitmq 설치
1. cmd에서 도커로 rabbitmq 설치 (로컬에 docker 가 미리 설치되어 있어야 한다.)
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 --restart=unless-stopped -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=root rabbitmq:management
2. docker ps 로 도커에 rabbitmq 이미지 확인
3. localhost:15672 접속 > rabbitMq 로그인화면 확인
(rabbitmq의 기본포트는 5672. 15672 는 브라우저에서 관리자ui 접속용 포트이다.)
4. root / root 로 로그인 rabbitMQ 어드민페이지 로그인 확인
*문자열 주고받기
5. sender 프로젝트 생성
필요 의존성 4가지
spring web, devtools, lombok, rabbitMq
6. 메인 application에
@EnableScheduling 추가 (스케줄링 기능 사용)
7. module 패키지 생성 + SenderModule.java 생성
8. Scheduled 사용해서 주기적으로 syso 실행되는것확인
8-1. LocalDateTime을 이용해 현재시간을 주기적으로 mq로 전송하도록 코드작성
9. application.yaml 설정
server:
port: 8080
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: root
password: root
10. application.yaml에 rabbitmq 포트를 15672로 해서 error 발생
Caused by: com.rabbitmq.client.ShutdownSignalException: connection error
5672로 수정함.
(rabbitmq의 기본포트는 5672. 15672 는 브라우저에서 관리자ui 접속용 포트이다.)
11. 실행하니 8080포트 이미사용에러
도커에서 8080포트 사용중인 컨테이가 있어서 그럼. 해당 컨테이너삭제함.
12. 정상구동됨. 콘솔과 mq어드민에서 확인하니 메세지가 발송되고 있는 현황확인됨.
13. springboot-rabbitMq-receiver
리시버 프로젝트를 새로 만든다. 의존성은 sender와 동일 하게 만들어줌.
14. application.yaml > sender 꺼 그대로 복붙 (포트만 8081로 수정)
15. receiverApplication 메인 클래스생성
16. module 패키지에 Receiver클래스생성. mq에서 메세지를 받을 수 잇도록 코드추가
17. 센더를 실행하고 리시버도 실행. 콘솔에서 각각 전송, 수신 되는것을 확인할 수 있다.
18. mq어드민에서도 확인.
리시버를 먼저끄고, 센더를 끄니 ready에 큐메세지가 쌓였음. > 리시버를 다시구동하니 쌓인 메세지 해소됨.
* 객체주고받기
1. 센더에 dto 패키지 > DeptDto 생성 .
2. 센더에 sender1 복사 sender2() 생성 sender1에 스케줄링은 주석처리
3. DeptDto를 메세지로 전송하도록 코딩 .
4. receiver 에서 DeptDto 생성.
5. DeptDto를 받을 수 있는 receiver2() 생성
6. 센더 실행
java.lang.IllegalArgumentException: SimpleMessageConverter only supports String, byte[] and Serializable payloads, received: com.leesh.sender.dto.DeptDto
at org.springframework.amqp.support.converter.SimpleMessageConverter.createMessage(SimpleMessageConverter.java:164) ~[spring-amqp-2.4.3.jar:2.4.3]
에러발생. SimpleMessageConverter는 String과 byte[] 만 지원한다는것.
객체를 전송하기 위해서는 컨버터가 필요함. (객체직렬화)
https://minholee93.tistory.com/entry/RabbitMQ-Jackson2JsonMessageConvertor
복사
@Bean
public Jackson2JsonMessageConverter jsonMessageConverter(){
return new Jackson2JsonMessageConverter();
}
config 패키지 생성 > Converter 클래스생성. 위 내용 넣어줌.
센더,리시버 둘다 만들어줌.
7.센더, 리시버 실행
8. DeptDto 객체가 정상적으로 mq를 통해 정상 발송, 수신 되는것 확인.
* 리시버에서 받고 다시 센더로 리턴 해주기.
리시버의
receiver2() 에 @SendTo 붙여주기. 리턴값을 void 에서 DeptDto로 수정
센더에도 receiver2() 에서 리턴한 메세지를 받을 수 있도록 receiverModule 만들어줌.
센더리시버 구동
센더에서는 1전송, 4수신
리시버에서는 2수신, 3전송
각각 정상적으로 실행되는것 확인.
끝~