2015-07-27 3 views
0

FYI, я новичок с RabbitMQ.convertSendAndReceive не работает, когда очередь с лопатой

У меня есть этот случай использования для моего приложения, для которого я пытаюсь использовать RabbitMQ:

  • Производитель посылает некоторое сообщение в очередь
  • Потребительский процесс и отправить ответ
  • Основываясь на Ответ Производитель действует на

Для вышеуказанного сценария я использовал convertSendAndReceive, который работает как шарм, когда производитель и потребитель находятся на одном сервере RabbitMQ. Но то же самое не работает, когда очередь перекошена.

Пожалуйста, дайте мне знать, если я использую неправильный метод/конфигурацию w.r.t RabbitMQ.

Заранее спасибо.

Добавление кода

Потребитель

public static void main(String[] args) throws InterruptedException { 
     ConnectionFactory cf = new CachingConnectionFactory("10.223.19.89");   

     // set up the queue, exchange, binding on the broker 
     RabbitAdmin admin = new RabbitAdmin(cf); 
     Queue queue = new Queue("myQueue"); 
     Queue queueReply = new Queue("myQueue_reply"); 

     admin.declareQueue(queue); 
     admin.declareQueue(queueReply); 
     TopicExchange exchange = new TopicExchange("myExchange"); 

     admin.declareExchange(exchange); 
     admin.declareBinding(
      BindingBuilder.bind(queue).to(exchange).with("foo.*")); 
     admin.declareBinding(
       BindingBuilder.bind(queueReply).to(exchange).with("foo.*")); 

     SimpleMessageListenerContainer container = 
       new SimpleMessageListenerContainer(cf); 
     Object listener = new Object() { 
      public String handleMessage(String foo) {    
       return foo + "test"; 
      } 
     }; 

     MessageListenerAdapter adapter = new MessageListenerAdapter(listener); 

     container.setMessageListener(adapter);   
     container.setQueueNames("myQueue");   
     container.start(); 

} 

Производитель

public void run() 
{ 

    Thread t = Thread.currentThread(); 
    ConnectionFactory cf = new CachingConnectionFactory("10.223.19.93"); 

    RabbitTemplate template = new RabbitTemplate(cf); 
    template.setExchange("myExchange"); 
    template.setRoutingKey("foo.bar"); 
    Queue queueReply = new Queue("myQueue_reply"); 
    template.setReplyQueue(queueReply);  

    Object test = template.convertSendAndReceive("Hello world"); 
    System.out.println(test.toString()); 

} 

public static void main(String[] args) throws InterruptedException { 
    for(int i=0; i< 5; i++) 
    { 
     Thread t = new Thread(new SendReceiveThread()); 
     t.setName("Thread # " + i); 
     t.start();  
     Thread.sleep(100); 
    } 

} 
+0

Также обратите внимание, что я сконфигурировал заголовки fwd в Shovel –

ответ

1

догадка, вы должны использовать named reply queue и лопатой его.

Для этого сценария вам понадобится <reply-listener/>.

До появления rabbitmq 3.4 для ответов использовалась временная очередь; прямой ответ-к используется с 3.4 и выше, но я предполагаю, что кролик не лопает созданную для него псевдоочередь.

EDIT:

При использовании очереди фиксированного ответа и создания шаблона кролика в программе, вы должны соединять слушающий контейнер и установить шаблон в качестве слушателя. См. the documentation.

Если вы определяете RabbitTemplate как <bean/>, или используя @Configuration класс, чтобы определить его как @Bean, или при создании шаблона программно, вам нужно будет определить и провод до слушателя контейнер ответ самостоятельно. Если вы этого не сделаете, шаблон никогда не получит ответы и, в конце концов, истечет время ожидания и вернет null в качестве ответа на вызов метода sendAndReceive.

+0

Я использовал очередь ответа имени и лопату для того же самого, и я мог видеть, что ответы находятся в очереди ответов производителя. Но я не вижу convertSendAndReceive, получая ответ из этой очереди. –

+0

Показать все настройки. –

+0

Я добавил свой код выше –

0

Весной кролика-1.4, вы просто конфиг потребителя, как это: {кролик: шаблон ID = "tutorialTemplate" соединение-завод = "ConnectionFactory" обмен = "ТРАСТ-ОБМЕН" маршрутизации ключ =» my. # "}

Главное, что вы должны удалить элемент конфигурации replyQueue. В этом случае вы используете значение по умолчанию «reply-to», которое находится в https://www.rabbitmq.com/tutorials/tutorial-six-java.html.

+0

Смежные вопросы