我有一个Spring Boot应用程序,我正在尝试通过RabbitMQ发送和接收消息。
问题
我可以成功地将消息发送到队列(即,我在RabbitMQ Manager中的队列上看到它们),但是我的接收器没有收到消息。
我有一个从JUnit调用的RESTful终结点,该终结点又称为发件人。在此JUnit测试运行时,将按预期加载Spring上下文,并调用 Sender 将消息成功添加到队列中。
问题
我还需要做些什么才能使接收者注册,以便它可以监听消息? (我怀疑因为我只是在运行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();
}
}
答案 0 :(得分:2)
您的发送者和接收者不属于同一个人资料!您应该使用@ActiveProfiles
@ActivesProfiles({"sender", "receiver"})
答案 1 :(得分:-1)
您需要为RabbitMQReceiver类添加@Component或@Service