(RabbitMQ) 라우팅키에 대한 경험

*Exchange에서 Topic또는 direct를 사용할 경우 Routing Key를 명시한다.


만약 amq.topic이라는 Exchange를 사용하여 chat큐에 메시지를 전송할 경우

클라이언트의 Publish측에서는 basicPublish("amq.topic","chat",null,바이트내용); 으로 보내주면 된다.(단, 이경우 amq.topic이라는 Exchange가 rabbitmq서버에 만들어져있는 경우이다. 없다면 Exchange를 만들어 주어야 한다.)
이는 amq.topic에서 chat라는 라우팅키를 가지는 메시지를 전송한다는 의미이다.

그렇다면 Consumer측에서는 어떻게 수신할까? 이 부분에서 상당히 본인의 경우는 많은 시간을 할애해야 했다......


클라이언트측에 Consumer에서는
channel.queueBind(q.getQueue(), "amq.topic","#.chat");

이런식으로 만들었는데, 이는 Consumer인 내가 amq.topic이라는 exchange로 부터 오는 
"#.chat"라는 라우팅키를 가지고 있는 (즉, Publish에서 .chat로 끝나는 라우팅키로 전송한것) 메시지를 channel과 연결되어있는 queue로 부터 받겠다. 라는 의미이다.

만약 그런 큐가 존재하지 않으면 임의로 rabbitmq서버 측에서 생성해버린다.
그 이유는 분명히 chat라는 큐가 존재하고 "chat" 라우팅키로 연결되어 있었다. 하지만 저 문장을 다시 실행해보니 chat라는 큐에 #.chat라는 라우팅키를 가지는 통로가 새로 생겼다.

즉, 메시지를보내는 입장에서는 메시지의 내용과 Exchange와 라우팅키만 신경쓰면되는것이다.
메시지를 수신하는 측은 라우팅키와 Exchange만 신경쓰면된다.
또한 중요한 점은 메시지를 수신하는 측은 수신측 마음대로 큐를 생성해도 된다. 



 
 
*문제점이었던 것.

Queue.Declare q=channel.queueDeclare();
channel.queueBind(q.getQueue(),"amq.topic","#.chat");

클라이언트의 메시지 수신측에서 위와 같이 선언하면 메시지가 수신되었다.

그러나 q.getQueue()를 "room1"이라는 큐 이름으로 바꾸니 수신이 되지않았다.
음... 큐로 부터 메시지는 한번만 수신 되기때문인가??(왜냐면 서버 측에서 이미 room1이라는 큐로 부터 메시지를 수신받았거든... 한번 테스트해보겟다) room1이라는 이름 대신
chat라는 큐로부터 받아보겟다.---->이 추측은아니다...

로그를 확인해보니
/큐 이름: amq.gen-Yf6xs4gymNkXNWBKQS_JJw
09-10
/큐 이름: amq.gen-KS3Y9S3XkzRI07OEokQ7tw

내가 생선한 큐가 아니라 임의로 생성된 큐로 부터 메시지를 받았다...........................

그래서 channel.queueDeclare("chat"...)으로 큐를 선언해보고 바인딩을 시도했는데,,,
역시나 안됫다...



알아냈다. queueBind는 그냥 Exchange와 queue를 바인드하는 것이고
channel.basicConsume()메소드에서 큐로부터 메시지를 받는 것이다.
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume("chat", true, consumer);


다음가 같이 consumer에 채널을 연결하고 그 채널로 부터 basicConsume를 그 큐로부터 메시지를 받는 것이다.

댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기