У меня есть приложение 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();
}
}