关于SpringCloud,Spring容器重复初始化的问题

近期在搭建一个公司的SpringCloud项目,但是在整合rocketmq的时候,启动的时候发现容器重复创建了,找了好久都没有找到问题,最后想到可以再两次重复创建的地方看一下他的堆栈信息,果然找到了,
StringUtils.join(Thread.currentThread().getStackTrace(), “\n”)

java.base/java.lang.Thread.getStackTrace(Thread.java:1602)
com.upward.common.core.rocketmq.handle.RocketApplicationCallback.onApplicationEvent(RocketApplicationCallback.java:61)
com.upward.common.core.rocketmq.handle.RocketApplicationCallback.onApplicationEvent(RocketApplicationCallback.java:34)
org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421)
org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378)
org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:938)
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586)
org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732)
org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:414)
org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)
org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)
com.upward.issueticket.IssueTicketApplication.main(IssueTicketApplication.java:14)

===========

java.base/java.lang.Thread.getStackTrace(Thread.java:1602)
com.upward.common.core.rocketmq.handle.RocketApplicationCallback.onApplicationEvent(RocketApplicationCallback.java:61)
com.upward.common.core.rocketmq.handle.RocketApplicationCallback.onApplicationEvent(RocketApplicationCallback.java:34)
org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421)
org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:427)
org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378)
org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:938)
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586)
org.springframework.cloud.context.named.NamedContextFactory.createContext(NamedContextFactory.java:137)
org.springframework.cloud.context.named.NamedContextFactory.getContext(NamedContextFactory.java:105)
org.springframework.cloud.context.named.NamedContextFactory.getInstance(NamedContextFactory.java:146)
org.springframework.cloud.openfeign.FeignClientFactoryBean.get(FeignClientFactoryBean.java:344)
org.springframework.cloud.openfeign.FeignClientFactoryBean.feign(FeignClientFactoryBean.java:123)
org.springframework.cloud.openfeign.FeignClientFactoryBean.getTarget(FeignClientFactoryBean.java:413)
org.springframework.cloud.openfeign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:402)
org.springframework.cloud.openfeign.FeignClientsRegistrar.lambda$registerFeignClient$0(FeignClientsRegistrar.java:235)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1249)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1191)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154)
com.upward.common.core.rocketmq.handle.RocketApplicationCallback.onApplicationEvent(RocketApplicationCallback.java:64)
com.upward.common.core.rocketmq.handle.RocketApplicationCallback.onApplicationEvent(RocketApplicationCallback.java:34)
org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421)
org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378)
org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:938)
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586)
org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732)
org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:414)
org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)
org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)
com.upward.issueticket.IssueTicketApplication.main(IssueTicketApplication.java:14)

这个是堆栈信息,中间用-----隔开,第一份是第一次创建容器的回调的时候,第二份是第二次回调,说到底还是openFeign的创建,它在Spring源码中的doCreateBean中会判断,如果当前容器不存在这个对象,就会重新创建一个新的容器
在这里插入图片描述
突然觉得之前Spring的源码没白嗑


补充一下,这个类NameContextFactory是为了每个微服务可以有自己独立的ApplicationContext,所以才独立出来的,但是由于他在createContext之后会调用refresh方法,所以会造成重复发布创建完成事件。详细了解: https://www.jianshu.com/p/d1e478d5fddb

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值