2013-08-30 3 views
5

RabbitMQ의 Channel#basicConsume 방법은 우리에게 다음 인수를 제공합니다RabbitMQ : 게시 할 큐를 지정하는 방법은 무엇입니까?

channel.basicConsume(queueName, autoAck, consumerTag, noLocal, 
    exclusive, arguments, callback); 

우리에게 정확히 우리가에서 소비 할 대기열에있는 RabbitMQ를 말할 수있는 능력을 부여.

channel.basicPublish(exchangeName, routingKey, mandatory, immediateFlag, 
    basicProperties, messageAsBytes); 

가 왜 큐를 지정할 수 없습니다 여기까지 게시 :

그러나 Channel#basicPublish는 그런 동등성이 없다?!? logging이라는 대기열에 Channel 게시를 게시하려면 어떻게해야합니까? 미리 감사드립니다!

+1

특정 경로 키 + 주제 교환과 어떻게 든 직접 교환 및 알려진 큐 이름과 배타적 큐, 수행 할 수 있습니다. – pinepain

+0

Thanks @ zaq178miami (+1) - 코드 예제를 제공 할 수 있습니까? 구엔 @tien –

답변

13

기본적으로 큐는 라우팅 키를 기반으로 교환기에 바인딩 될 수 있습니다.

3 명의 다른 게시자가 있다고 가정합니다. 당신은 메시지를 사용 소비자를 가질 수

routingKey "일자리"로 교환 "작업"routingKey와
Publisher3 보내는 메시지를 교환하는 "이벤트"routingKey와
Publisher2 보내는 메시지를 교환하는 메시지를 전송
Publisher1 특정 routhingKey와 함께. 예를 들어
당신이 '#의'와 같이 라우팅 줄 교환에 오는 모든 메시지를 사용하려면이

channel.queueBind(queueName, exchangeName, "events"); 

같이 선언 "이벤트"메시지에 대한 소비자를하기 위해

즉, 제가 말할 수있는 것은 짧습니다.
1. 메시지는 거래소에 게시됩니다.
2. 큐는 routingKeys를 기반으로 교환하도록 바인딩됩니다.
3. RabbitMQ는 일치하는 라우팅 키가있는 메시지를 해당 대기열로 전달합니다.

자습서를 참조하십시오 - http://www.rabbitmq.com/tutorials/tutorial-three-java.html

RabbitMQ에서 메시징 모델의 핵심 아이디어는 생산자가 큐에 직접 메시지를 전송하지 않을 것입니다. 사실, 생산자는 메시지가 어떤 대기열에 전달되는지 전혀 모릅니다. 대신 제작자는 교환기에게만 메시지를 보낼 수 있습니다.

+0

최고 @ 존 (+1과 녹색 체크) 해당되지 않습니다! -?를, 도움이 철저하고 유익한 답변에 대한 감사 –

0

이 시도하십시오 : 그것은 내 프로젝트에 대한 일

channel.basicPublish("", yourQueueName, null, 
     message.getBytes((Charset.forName("UTF-8")))); 

.

+1

덕분에 (+1) - 당신이 ['basicPublish이 (java.lang.String의 교환, java.lang.String의 routingKey, AMQP.BasicProperties 소품, 바이트 [] 몸을)'(사용하는 것처럼하지만, 그것은 본다 http://www.rabbitmq.com/releases/rabbitmq-java-client/v1.7.2/rabbitmq-java-client-javadoc-1.7.2/com/rabbitmq/client/Channel.html#basicPublish%28java.lang. 문자열 %의 20java.lang.String %의 20com.rabbitmq.client.AMQP.BasicProperties, basicPublish' '의 %의 20byte [] 29 %) 과부하. 그 overload에서, "yourQueueName"으로 가지고있는 두번째 파라미터는 "routingKey"입니다. 그래서 "routingKey"RabbitMQ는 "queue name"에 대한 설명입니까? –

+0

@TicketMonster routingKey는 큐를 의미하지 않습니다. routingKey에 만 기초 교환에 적용되는 라우팅 키 의지가 큐에 보낼 수 있도록 메시지를 기본 교환에 보내지는 좀 더 구체적으로. –

+0

을 routingKey가. 내 대답을 참조 것을에만 메시지를받을 수 없습니다. 그러나 어떤 이들은합니다 – robthewolf

10

@Tien Nguyen의 대답을 확장하려면 RabbitMQ에 "속임수"가있어 효과적으로 대기열에 게시 할 수 있습니다. 각 대기열은 AMQP 기본 교환에 자동으로 바인드되며 대기열의 이름은 라우팅 키로 사용됩니다. 기본 교환은 "이름이없는 교환"이라고도 알려져 있습니다. 즉 이름이 빈 문자열입니다. 따라서 대기열 이름과 동일한 라우팅 키를 사용하여 ""이라는 교환기에 게시하는 경우 메시지는 해당 대기열로 이동합니다. @ 존 (John)이 말했듯이 그것은 교환을 통해 진행됩니다. 그것은 당신이 선언하거나 자신을 묶을 필요가없는 것입니다.

Java 클라이언트를이 코드를 사용해보기에 편리하지 않지만 제대로 작동합니다.

channel.basicPublish("", myQueueName, false, false, null, myMessageAsBytes); 

그러나 이것이 RabbitMQ의 작동 원리와 반대되는 내용입니다. 일반적인 응용 프로그램 흐름의 경우 교환을 선언하고 바인딩해야합니다. 그러나 예외적 인 경우에는 "속임수"가 유용 할 수 있습니다. 예를 들어, Rabbit 관리 콘솔을 사용하여 Exchange 생성 및 바인딩 의식없이 메시지를 수동으로 큐에 게시 할 수 있습니다. 당신이 원하는 무엇

+0

는 큐도 교환에 바인딩 된 경우에도이 속임수 일 –

+0

그래, 우리는 코드가됩니다 것인가 다른 교환기에 묶여있는 대기열에이 작업을 수행합니다. –

+0

놀랍습니다. 자동화 된 테스트에 꼭 필요한 것입니다. 감사합니다. –

관련 문제