Spring Boot AMQP @RabbitListener не получает сообщения - PullRequest
3 голосов
/ 28 апреля 2019

У меня есть приложение Spring Boot, и я пытаюсь отправлять и получать сообщения через RabbitMQ.

Проблема

Я могу успешно отправлять сообщения в очередь (т.е. я вижу их в очереди в RabbitMQ Manager), однако мой Receiver не получает сообщения.

У меня есть конечная точка RESTful, которую я вызываю из JUnit, которая в свою очередь вызывает Отправителя . Во время выполнения этого теста JUnit контекст Spring загружается, как ожидается, и вызывается Sender , который успешно добавляет сообщения в очередь.

Вопрос

Есть ли что-то еще, что мне нужно сделать, чтобы Receiver зарегистрировался, чтобы он прослушивал сообщения? (Я подозреваю, что, поскольку я просто запускаю тест JUnit, он заканчивается до того, как Receiver сможет прослушивать сообщения). Есть ли способ сохранить тест работоспособным, чтобы Receiver мог принимать сообщения до его завершения?

Код

Отправитель

@Service
public class RabbitMQSender {

    @Autowired
    private AmqpTemplate rabbitTemplate;

    @Value("${rabbitmq.exchangename}")
    private String exchange;

    @Value("${rabbitmq.routingkeyname}")
    private String routingkey;  

    public void send(String uuid) {
        rabbitTemplate.convertAndSend(exchange, routingkey, uuid);
        System.out.println("Send RabbitMQ ("+exchange+" "+routingkey+")  msg = " + uuid);       
    }
}

Приемник

public class RabbitMQReceiver {

    @RabbitListener(queues = "${rabbitmq.queuename}")
    public void receive(String in) {
        System.out.println("Received RabbitMQ  msg = " + in);       
    }
}

Конфигурация

@Configuration
public class RabbitMQConfig {

    @Value("${rabbitmq.queuename}")
    String queueName;

    @Value("${rabbitmq.exchangename}")
    String exchange;

    @Value("${rabbitmq.routingkeyname}")
    String routingkey;

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

    @Bean
    DirectExchange exchange() {
        return new DirectExchange(exchange);
    }

    @Bean
    Binding binding(Queue queue, DirectExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(routingkey);
    }

    @Profile("receiver")
    @Bean
    public RabbitMQReceiver receiver() {
        return new RabbitMQReceiver();
    }

    @Profile("sender")
    @Bean
    public RabbitMQSender sender() {
        return new RabbitMQSender();
    }
}

Ответы [ 2 ]

2 голосов
/ 28 апреля 2019

Ваш отправитель и получатель не принадлежат к одному профилю!Вы должны включить оба профиля в свои тесты Junit, используя @ActiveProfiles

@ActivesProfiles({"sender", "receiver"})
0 голосов
/ 28 апреля 2019

Вам нужно добавить класс @Component или @Service for RabbitMQReceiver

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...