본문 바로가기

개발

rabbitmq tutorial 1 - Docker로 띄우고 hello world 찍어보기

목표 : 도커로 RabbitMq 를 간단히 설치하고 hello world 를 찍어보기. 


도커에서 다음 명령어로 이미지를 받고 컨테이너를 실행한다. 

- 기본 포트 15672->8080으로 설정했음. 
- 아이디/비밀번호 : admin/admin으로 설정


docker run -d --name rabbitmq -p 5672:5672 -p 8080:15672 --restart=unless-stopped -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:management

- 참고 : https://hub.docker.com/_/rabbitmq


처음 docker로 run을 하면 이미지가 없어서 받아옴.

Unable to find image 'rabbitmq:management' locally
management: Pulling from library/rabbitmq


run 명령어 이후 프로세스가 돌아가는 모습




위에서 RABBITMQ_DEFAULT_USER, RABBITMQ_DEFAULT_PASS 를 admin/admin으로 설정 했다. 

로그인도 똑같이 admin/admin으로 하면 됨. 




아래 화면이 로그인 한 모습 




RabbitMq Management 까지 보이고 쉽게 설치 완료. 


다음 스텝은 공식 홈페이지에 나와있는 rabbitmq 튜토리얼을 따라해 보자 



두개의 자바 프로그램으로 시작! producer는 하나의 메세지를 전송하고 consumer는 그 메세지를 받아서 화면에 출력한다. 역시 시작은 가장 간단한 "Hello World” 메세지 찍기!!! 

아래 다이어그램에 "P" 는 producer  "C" 는 consumer. 
빨간색은 queue 인데 메세지를 Consumer에 전달하기 전 가지고 있는곳이다. 



Send.java

ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
     Channel channel = connection.createChannel()) {

}
Connection은 소켓 연결을 추상화 하고 프로토콜의 버전 관리 negotiation 과 인증 등을 처리한다.  이제 api를 처리하기 위한 channel을 만든다. 메세지를 보내기 위해서 queue를 선언해야하고, 그 이후에 메세지를 queue에 pubilsh 할 수 있다.

try에서 객체를 선언한 이유를 모른다면..? --> 3. The try-with-resources Statement 참고

출처: https://mio-java.tistory.com/26?category=619500



channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'”);

queueDeclare로 큐를 선언하는건 idempotent (멱등원 : 존재 하지 않을 경우에만 생성). 메시지 내용은 바이트 배열이라서 원하는 대로 encode를 할 수 있다.


channel.close();
connection.close();

보내고 나서 channel 과 connection 이 닫힌다.


send 소스 주소

Receiving


DefaultConsumer는 서버가 푸시 한 메시지를 버퍼링 하는데 사용할 Consumer인터페이스를 구현하는 클래스 이다. 

Setting은 publisher와 동일하다. Connection 과 Channel 을 열고, 소비할 queue를 선언 한다. Send에 나오는 publish와 같다. 


channel.queueDeclare(QUEUE_NAME, false, false, false, null);
이제 큐를 선언한다. publisher하기 전에 consumer가 시작될수 있게 때문에, consumer들로부터 메시지를 사용하기 전에 큐가 있는지 확인하려고 한다.


queue에서 메시지를 보내라고 서버에 알려준다. 메시지를 비동기식으로 푸시하므로 사용할 준비가 될 때까지 메시지를 버퍼링하는 개체 형식으로 콜백을 제공한다.

receive 주소


-------------------------------------------------------------------------------

git에서 소스 그대로 복붙하고 돌렸는데 다음과 같이 에러~ 

Login was refused using authentication mechanism PLAIN.

먼지 모르겟는데 로그를 보면 로그인이 안됨. 
도커를 띄울때 admin/admin을 설정했는데 어디가 넣어주는 부분이 있어야 하는데 안넣어줘서 그런거 같음.

예제에서 ConnectionFactory에서 host를 설정하는거 보니 Port, password 설정하는 부분도 있을거 같다. 


ConnectionFactory보면 default_user, default_pass 기본값이 있음. 



rabbitMq Management 사이트를 보면 user 추가 하는게 있음. 

Connection Factory에 기본값으로 설정된 guest를 추가한다. 




스크린샷에서 나는 이미 권한을 다 주었는데,  permission을 주지 않으면(set Permission 클릭) 메세지 전송시 권한이 없다고 에러 난다. 



permission 을 설정하고 Sending에서 준 데이터를 Receiving에서 받은 모습



데이터를 받으면 Management 툴에서는 Message rate 차트에 다음과 같이 나타난다. 

끝!!!!