防止 spring-rabbit 中的 @RabbitListener 在集成测试期间尝试连接到服务器

Pet*_*ete 8 java spring rabbitmq spring-rabbit

我想为我使用 rabbitMq 的服务运行一些验收测试,但我想忽略所有需要服务间通信 (amqp) 的服务。

然而,问题是 Spring 尝试在启动时连接到(不存在的)rabbit 主机,以便它可以注册其使用者。它对每个注释的方法都@RabbitListener这样做,如果我的服务中有多个侦听器,这可能会因长时间超时而变得非常烦人。

我怎样才能减少这个超时甚至一起阻止@RabbitListener 连接?

我们的(简化的)Rabbit 配置:

@Configuration
@EnableRabbit
public class RabbitMqConfig {

    public RabbitMqConfig(
            @Value("${rabbitmq.host}") String rabbitHost,
            @Value("${rabbitmq.port}") int rabbitPort,
            @Value("${exchange.name}") String exchange) {
        this.rabbitHost = rabbitHost;
        this.rabbitPort = rabbitPort;
        this.exchange= exchange;
    }

  @Bean
  DirectExchange directExchangeBean() {
    return new DirectExchange(this.exchange, true, false);
  }

  @Bean
  public ConnectionFactory connectionFactory() {
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory(rabbitHost);
    connectionFactory.setPort(rabbitPort);
    return connectionFactory;
  }

  @Bean
  public RabbitTemplate rabbitTemplate() {
    return new RabbitTemplate(connectionFactory());
  }


  @Bean
  public Queue itemDoneQueue() {
    return new Queue(ITEM_DONE_QUEUENAME, true);
  }

  @Bean
  Binding itemDoneBinding() {
    return BindingBuilder.bind(itemDoneQueue()).to(directExchangeBean()).with(ITEM_DONE_KEY);
  }

}
Run Code Online (Sandbox Code Playgroud)

特性

rabbitmq.host=192.168.42.100
rabbitmq.port=5672
exchange.name=myExchange
Run Code Online (Sandbox Code Playgroud)

听者:

  @RabbitListener(queues = ITEM_DONE_QUEUENAME)
  public void receiveMessageFromItemDoneQueue(String message) {
    // do the work
  }
Run Code Online (Sandbox Code Playgroud)

考试:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {Application.class}) 
public abstract class RabbitTest {
Run Code Online (Sandbox Code Playgroud)

这里真的没什么特别的。显然,在测试期间,兔子主机不可用。那没关系。我想忽略这个事实。而且很快。

我试过了

spring.rabbitmq.connection-timeout=1
Run Code Online (Sandbox Code Playgroud)

但这并没有改变任何事情。

使用

spring.rabbitmq.listener.simple.auto-startup=false
Run Code Online (Sandbox Code Playgroud)

也不做任何事情。

使用

spring.autoconfigure.exclude:org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration
Run Code Online (Sandbox Code Playgroud)

只是杀死了我的应用程序上下文加载与 spring 抱怨 NoSuchBeanDefinitionException: No bean named 'rabbitListenerContainerFactory' available

有任何想法吗?谢谢!

小智 7

我也遇到过类似的问题,但解决了

spring.rabbitmq.listener.direct.auto-startup=false

SpringBoot版本2.2.4.RELEASE

Spring框架版本5.2.3.RELEASE


Pet*_*ete 1

感谢您的投入,加里。我已经找到了适合我的解决方案。由于某种原因,消费者初始化的连接超时没有在CachingConnectionFactory我使用的属性中公开,也没有在我尝试使用的属性中公开(spring.rabbitmq.connection-timeout)。

我现在要做的是初始化基本 ConnectionFactory 并将其传递给 CachingConnectionFactory (当然不知道差异在哪里,但大多数情况下 spring 都是这种情况):

  @Bean
  public ConnectionFactory connectionFactory() {
    com.rabbitmq.client.ConnectionFactory connectionFactory = new com.rabbitmq.client.ConnectionFactory();
    connectionFactory.setConnectionTimeout(this.connectionTimeout);
    connectionFactory.setHost(this.rabbitHost);
    connectionFactory.setPort(this.rabbitPort);
    CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory(
        connectionFactory);
    return cachingConnectionFactory;
  }
Run Code Online (Sandbox Code Playgroud)

现在,我可以在验收测试期间将超时设置为 1,从而导致使用者初始化快速失败并设置为更高的部署值。