Spring初始化顺序- RabbitMq 无法自动创建队列
项目中使用了RabbitMq, 并配置了自动创建topic, exchange,binding 等,但是通过测试发现,有一个队列始终无法自动创建,在对spring 源码以及rabbitmq 源码debug 后发现问题。
rabbitmq 配置了两套环境 , 以下为代码示例
@Configuration
public class RabbitMqConfiguration {
/**
* one mq配置
*/
@Bean(name = "oneRabbitMQProperties")
@ConfigurationProperties(prefix = "spring.rabbitmq.one")
public RabbitMQProperties oneRabbitMQProperties() {
return new RabbitMQProperties();
}
@Primary
@Bean(name = "oneRabbitConnectionFactory")
public ConnectionFactory oneRabbitConnectionFactory(@Qualifier("oneRabbitMQProperties") RabbitMQProperties rabbitMQProperties) {
return connectionFactory(rabbitMQProperties, false);
}
@Primary
@Bean("oneRabbitMqAdmin")
public RabbitAdmin oneRabbitMqAdmin(@Qualifier("oneRabbitConnectionFactory") ConnectionFactory oneRabbitConnectionFactory){
return new RabbitAdmin(oneRabbitConnectionFactory);
}
@Primary
@Bean(name = "oneRabbitTemplate")
public RabbitTemplate oneRabbitTemplate(@Qualifier("oneRabbitConnectionFactory") ConnectionFactory connectionFactory) {
return new RabbitTemplate(connectionFactory);
}
/**
* two mq配置
*/
@Bean(name = "twoRabbitMQProperties")
@ConfigurationProperties(prefix = "spring.rabbitmq.two")
public RabbitMQProperties twoRabbitMQProperties() {
return new RabbitMQProperties();
}
@Bean(name = "twoRabbitConnectionFactory")
public ConnectionFactory twoRabbitConnectionFactory(@Qualifier("twoRabbitMQProperties") RabbitMQProperties rabbitMQProperties) {
return connectionFactory(rabbitMQProperties, false);
}
@Bean("twoRabbitMqAdmin")
public RabbitAdmin twoRabbitMqAdmin(@Qualifier("twoRabbitConnectionFactory") ConnectionFactory twoRabbitConnectionFactory){
return new RabbitAdmin(twoRabbitConnectionFactory);
}
@Bean(name = "twoRabbitTemplate")
public RabbitTemplate twoRabbitTemplate(@Qualifier("twoRabbitConnectionFactory") ConnectionFactory connectionFactory) {
return new RabbitTemplate(connectionFactory);
}
private ConnectionFactory connectionFactory(RabbitMQProperties rabbitMQProperties, boolean transaction) {
CachingConnectionFactory factory = new CachingConnectionFactory(rabbitMQProperties.getHost(), rabbitMQProperties.getPort());
factory.setUsername(rabbitMQProperties.getUsername());
factory.setPassword(rabbitMQProperties.getPassword());
factory.setPublisherConfirms(!transaction);
factory.setPublisherReturns(true);
factory.setVirtualHost(rabbitMQProperties.getVirtualHost());
return factory;
}
Queue, Exchange, Binding 自动生成配置:
@Configuration
public class RabbitMqQueueConfiguration {
@Bean
public Queue oneQueue(@Qualifier("oneRabbitMqAdmin") RabbitAdmin oneRabbitMqAdmin) {
Queue queue = new Queue("one_auto_test");
queue.setAdminsThatShouldDeclare(oneRabbitMqAdmin);
return queue;
}
@Bean
public DirectExchange oneExchange(@Qualifier("oneRabbitMqAdmin") RabbitAdmin oneRabbitMqAdmin) {
DirectExchange exchange = new DirectExchange("one_auto_test");
exchange.setAdminsThatShouldDeclare(oneRabbitMqAdmin);
return exchange;
}
@Bean