Spring Boot AMQP @RabbitListener没有收到消息

时间:2019-04-28 11:07:11

标签: java spring-boot junit rabbitmq spring-rabbitmq

我有一个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();
    }
}

2 个答案:

答案 0 :(得分:2)

您的发送者和接收者不属于同一个人资料!您应该使用@ActiveProfiles

将这两个配置文件都包括在Junit测试中
@ActivesProfiles({"sender", "receiver"})

答案 1 :(得分:-1)

您需要为RabbitMQReceiver类添加@Component或@Service