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
感谢您的投入,加里。我已经找到了适合我的解决方案。由于某种原因,消费者初始化的连接超时没有在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,从而导致使用者初始化快速失败并设置为更高的部署值。
归档时间: |
|
查看次数: |
9952 次 |
最近记录: |