SpringBootProject/SpringBoot_RabbitMQ

Springboot + RabbitMQ 연동

ironmask431 2022. 4. 30. 12:46

목적

  1. springBoot와 RabbitMQ 연동
  2. RabbitMQ를 통해 문자열과 객체 sender, receive 만들어보기

개발순서

  1. Local에 docker를 통해서 RabbitMQ 설치
  2. 문자열 sender, receiver 개발, 테스트
  3. 객체 sender, receiver 개발, 테스트

메시지 흐름

  1. Sender 에서 Receiver로 메세지 전송
  2. Receiver 에서 메세지 수신
  3. Receiver 에서 메시지 수신 후 Sender로 메세지 리턴
  4. 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전송 

각각 정상적으로 실행되는것 확인.

 


끝~