错误栈
The dependencies of some of the beans in the application context form a cycle:
servletEndpointRegistrar defined in class path resource [org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfiguration$WebMvcServletEndpointManagementContextConfiguration.class]
↓
healthEndpoint defined in class path resource [org/springframework/boot/actuate/autoconfigure/health/HealthEndpointConfiguration.class]
↓
healthIndicatorRegistry defined in class path resource [org/springframework/boot/actuate/autoconfigure/health/HealthIndicatorAutoConfiguration.class]
↓
org.springframework.boot.actuate.autoconfigure.amqp.RabbitHealthIndicatorAutoConfiguration
┌─────┐
| rabbitTemplate defined in class path resource [org/springframework/boot/autoconfigure/amqp/RabbitAutoConfiguration$RabbitTemplateConfiguration.class]
↑ ↓
| myRabbitConfig (field org.springframework.amqp.rabbit.core.RabbitTemplate com.atguigu.gulimall.ware.config.MyRabbitConfig.rabbitTemplate)
└─────┘
在消息队列的配置文件中,因为要用到rabbitTemplate来设置消息回调
@Configuration
public class MyRabbitConfig {
@Autowired
RabbitTemplate rabbitTemplate;
@Bean
public MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
@PostConstruct
public void initRabbitTemplate() {
//设置消息抵达Broker的确认回调
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
***
});
//设置消息抵达队列的确认回调
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
***
});
}
}
所以是自动注入引起的循环注入,尝试用构造器手动注入
@Configuration
public class MyRabbitConfig {
//@Autowired
RabbitTemplate rabbitTemplate;
public MyRabbitConfig(RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
initRabbitTemplate();
}
@Bean
public MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
//@PostConstruct
public void initRabbitTemplate() {
//设置消息抵达Broker的确认回调
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
***
});
//设置消息抵达队列的确认回调
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
***
});
}
}
发现还是循环注入
参照 他的自动配置类 RabbitAutoConfiguration
传入 ConnectionFactory
连接工厂并通过@Bean
放入容器中
@Configuration
public class MyRabbitConfig {
//@Autowired
RabbitTemplate rabbitTemplate;
@Primary
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
this.rabbitTemplate = rabbitTemplate;
rabbitTemplate.setMessageConverter(messageConverter());
initRabbitTemplate();
return rabbitTemplate;
}
@Bean
public MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
//@PostConstruct
public void initRabbitTemplate() {
//设置消息抵达Broker的确认回调
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
***
});
//设置消息抵达队列的确认回调
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
***
});
}
}
启动成功
但是这样手动会丢失一些配置信息,自动配置类中创建这个 RabbitTemplate
时设置的配置信息。
待完善