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

标签 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);
  }

}

属性

rabbitmq.host=192.168.42.100
rabbitmq.port=5672
exchange.name=myExchange

听众:

  @RabbitListener(queues = ITEM_DONE_QUEUENAME)
  public void receiveMessageFromItemDoneQueue(String message) {
    // do the work
  }

测试:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {Application.class}) 
public abstract class RabbitTest {

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

我试过了

spring.rabbitmq.connection-timeout=1

但这并没有改变任何东西。

使用

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

什么都不做。

使用

spring.autoconfigure.exclude:org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration

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

有什么想法吗? 谢谢!

最佳答案

我遇到过类似的问题,但是用

解决了

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

SpringBoot 版本 2.2.4.RELEASE

Spring框架版本5.2.3.RELEASE

关于java - 在集成测试期间防止 spring-rabbit 中的@RabbitListener 尝试连接到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44927085/

相关文章:

java - 连接到 Outlook.com smtp 服务器时出现 Spring 邮件错误

RabbitMQ 管理插件 - 配置不变

Spring “prototype” bean 范围与 “new” 运算符

java - 如何使用 Swagger Codegen 在 String 中定义枚举值

java - 在 Java 中通过套接字有效地发送大的 int[]

java - 拆分字符串两次

asynchronous - 如何处理 GraphQL Apollo 客户端中的异步突变

java - 如何使用 muleClient.request 从 Java 实现异步 AMQP-RabbitMQ?

java - 模拟模拟方法的副作用

java - 使用自己的外部库部署 GWT 应用程序