목표 : 도커로 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 참고
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
}
출처: 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 차트에 다음과 같이 나타난다.
끝!!!!
'개발' 카테고리의 다른 글
rabbitmq tutorial 3 - Publish/Subscribe (0) | 2018.12.05 |
---|---|
rabbitmq tutorial 2 - Work Queues 와 Round Robbin (0) | 2018.12.04 |
@EnableAspectJAutoProxy 와 proxyTargetClass 속성 (0) | 2018.11.22 |
for each 돌면서 list 삭제 할때 문제. ConcurrentModificationException (0) | 2018.11.14 |
hibernate warning 원인과 해결방법 (0) | 2018.11.09 |