我有一个发布事件 E1 的 A 类。 E1 由 B 类在使用 @RabbitListener 注释的同一应用程序中使用。 B 做一些事情,然后发布由 C 等消费的事件 E2(形成一个流程链)。

我想做的是两件事:

  • 我想在集成测试中测试 A 但这样做时我想禁用 RabbitListener's 以便不执行作为 E1 发布结果的整个过程。我只想断言 A 做了它应该做的事情并发布了 E1。我通过设置 spring.rabbitmq.listener.auto-startup=false 设法适应了这一点。
  • 我还想通过将 E1 发布到 RabbitMQ 来在集成测试中测试 B,这样我就可以确信我已经正确配置了 B 的 RabbitListerner。但同样,我不希望 C 被称为 E2 发布的副作用。

  • 我知道我可能可以使用模拟来做到这一点,但最好我想测试真正的交易并使用实际组件(包括将消息发送到在我的情况下在 Docker 中运行的实际 RabbitMQ 实例)。

    我可以在 Spring Boot 中以一种很好的方式实现这一目标吗?或者是否建议使用 @RabbitListenerTest 并确实使用模拟?

    最佳答案

    @RabbitListenerid 属性:

    /**
     * The unique identifier of the container managing for this endpoint.
     * <p>If none is specified an auto-generated one is provided.
     * @return the {@code id} for the container managing for this endpoint.
     * @see org.springframework.amqp.rabbit.listener.RabbitListenerEndpointRegistry#getListenerContainer(String)
     */
    String id() default "";
    

    并且 RabbitListenerEndpointRegistry#getListenerContainer(String) 返回 MessageListenerContainer 并且您已经可以控制单个 start()/stop() 处理程序的 @RabbitListener

    关于java - 在 Spring 中以编程方式启用和禁用某些 @RabbitListener 吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43365135/

    10-11 17:40