2015-04-10 4 views
2

Я пытаюсь настроить обмен темы на моем приложении весны. Вот моя конфигурация контекста:Spring и AMQP RabbitMQ обмен темы не работает

 


    @Configuration 
    public class IntegrationConfig { 

     public final static String queueName = "my-queue"; 

     @Bean 
     AmqpAdmin amqpAdmin(ConnectionFactory connectionFactory) { 
      return new RabbitAdmin(connectionFactory); 

     } 

     @Bean 
     Queue queue() { 
      return new Queue(queueName); 
     } 

     @Bean 
     TopicExchange exchange() { 
      return new TopicExchange("my-exchange", false, true); 
     } 

     @Bean 
     Binding binding(Queue queue, TopicExchange exchange) { 
      return BindingBuilder.bind(queue).to(exchange).with("ru.interosite.*"); 
     } 

     @Bean 
     SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { 
      SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
      container.setConnectionFactory(connectionFactory); 
      container.setQueueNames(queueName); 
      container.setMessageListener(listenerAdapter); 
      return container; 
     } 

     @Bean 
     ImageUploadReceiver receiver() { 
      return new ImageUploadReceiver(); 
     } 

     @Bean 
     MessageListenerAdapter listenerAdapter(ImageUploadReceiver receiver) { 
      return new MessageListenerAdapter(receiver, "receiveMessage"); 
     } 

    } 

 

Это класс приемника:

 


    public class ImageUploadReceiver { 
     private CountDownLatch latch = new CountDownLatch(1); 

     public void receiveMessage(String message) { 
      System.out.println("Received "); 
      latch.countDown(); 
     } 

     public CountDownLatch getLatch() { 
      return latch; 
     } 
    } 

 

Это код отправителя:

 


    @RequestMapping("/sendmessage") 
    @ResponseBody 
    public String sendMessage() { 
     rabbitTemplate.convertAndSend("ru.interosite.1", "ttt1233"); 
     try { 
      imageUploadReceiver.getLatch().await(3, TimeUnit.SECONDS); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     return "Msg received"; 
    } 

 

Так я отправляю сообщение на тему обмен с помощью связывания ключа " ru.interosite.1 "в очередь, связанную с шаблоном" ru.interosite. * ". Я использовал этот ключ и шаблон, когда попробовал образец от https://www.rabbitmq.com/tutorials/tutorial-five-java.html, и они отлично работали.

Но внутри строки AMQP это не работает, т. Е. Приемник никогда не вызывается. Он называется только если ключ привязки и шаблон полностью совпадают, как если бы я использовал DirectExchange.

Я что-то упустил?

ответ

2

Вы не указали конфигурацию для RabbitTemplate, но я думаю, что это с настройками по умолчанию.

Чтобы отправить сообщение в my-exchange необходимо указать его непосредственно:

rabbitTemplate.convertAndSend("my-exchange", "ru.interosite.1", "ttt1233"); 
+0

Большое вам спасибо! Конечно, я должен был догадаться, что этот шаблон не знает имя обмена. – Cyrusmith

0

Вы можете также установить обмен в шаблоне кролика, как это:

@Configuration 
public class IntegrationConfig { 

    // ... as above 

    @Bean 
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { 
     RabbitTemplate template = new RabbitTemplate(connectionFactory); 
     template.setExchange("my-exchange"); 
     return template; 
    } 

} 

Таким образом, вы можете отправить сообщение с:

public class MyController { 

    @Autowired 
    RabbitTemplate rabbitTemplate; 

    @RequestMapping("/sendmessage") 
    @ResponseBody 
    public String sendMessage() { 
     rabbitTemplate.convertAndSend("ru.interosite.1", "ttt1233"); 
     // ... as above 
    } 

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