Spring-cloud 导致应用收到多次ApplicationPreparedEvent

2023-10-27

最近排查发现DubboComponent被重复注册,怀疑ApplicationPreparedEvent收到了多次

public final class DubboConfigApplicationListener
    implements ApplicationListener<ApplicationPreparedEvent>, Ordered {

  @Override
  public void onApplicationEvent(ApplicationPreparedEvent event) {

  	BaseComponentRegister.getInstance().registerComponent(new DubboComponent());
  }
}

通过debug发现分别被执行多了多次,堆栈如下

DubboConfigApplicationListener.onApplicationEvent(ApplicationPreparedEvent) line: 66	
DubboConfigApplicationListener.onApplicationEvent(ApplicationEvent) line: 23	
SimpleApplicationEventMulticaster.invokeListener(ApplicationListener, ApplicationEvent) line: 167	
SimpleApplicationEventMulticaster.multicastEvent(ApplicationEvent, ResolvableType) line: 139	
SimpleApplicationEventMulticaster.multicastEvent(ApplicationEvent) line: 122	
EventPublishingRunListener.contextLoaded(ConfigurableApplicationContext) line: 91	
SpringApplicationRunListeners.contextLoaded(ConfigurableApplicationContext) line: 66	
SpringApplication.prepareContext(ConfigurableApplicationContext, ConfigurableEnvironment, SpringApplicationRunListeners, ApplicationArguments, Banner) line: 356	
SpringApplication.run(String...) line: 301	
SpringApplication.run(Object[], String[]) line: 1118	
SpringApplication.run(Object, String...) line: 1107	
WebApplication.main(String[]) line: 18	
DubboConfigApplicationListener.onApplicationEvent(ApplicationPreparedEvent) line: 66	
DubboConfigApplicationListener.onApplicationEvent(ApplicationEvent) line: 23	
SimpleApplicationEventMulticaster.invokeListener(ApplicationListener, ApplicationEvent) line: 167	
SimpleApplicationEventMulticaster.multicastEvent(ApplicationEvent, ResolvableType) line: 139	
AnnotationConfigEmbeddedWebApplicationContext(AbstractApplicationContext).publishEvent(Object, ResolvableType) line: 393	
AnnotationConfigEmbeddedWebApplicationContext(AbstractApplicationContext).publishEvent(ApplicationEvent) line: 347	
RestartListener.onApplicationEvent(ApplicationEvent) line: 68		//spring-cloud再次发送event
SimpleApplicationEventMulticaster.invokeListener(ApplicationListener, ApplicationEvent) line: 167	
SimpleApplicationEventMulticaster.multicastEvent(ApplicationEvent, ResolvableType) line: 139	
AnnotationConfigEmbeddedWebApplicationContext(AbstractApplicationContext).publishEvent(Object, ResolvableType) line: 393	
AnnotationConfigEmbeddedWebApplicationContext(AbstractApplicationContext).publishEvent(ApplicationEvent) line: 347	
AnnotationConfigEmbeddedWebApplicationContext(AbstractApplicationContext).finishRefresh() line: 883	
AnnotationConfigEmbeddedWebApplicationContext(EmbeddedWebApplicationContext).finishRefresh() line: 144	
AnnotationConfigEmbeddedWebApplicationContext(AbstractApplicationContext).refresh() line: 546	
AnnotationConfigEmbeddedWebApplicationContext(EmbeddedWebApplicationContext).refresh() line: 122	
SpringApplication.refresh(ApplicationContext) line: 693	
SpringApplication.refreshContext(ConfigurableApplicationContext) line: 360	
SpringApplication.run(String...) line: 303	
SpringApplication.run(Object[], String[]) line: 1118	
SpringApplication.run(Object, String...) line: 1107	
WebApplication.main(String[]) line: 18	

原因很明显了,org.springframework.cloud.context.restart.RestartListener会在ContextRefreshedEvent再次发送ApplicationPreparedEvent,代码如下


package org.springframework.cloud.context.restart;

import org.springframework.boot.context.event.ApplicationPreparedEvent;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.SmartApplicationListener;

/**
 * A listener that stores enough information about an application as it starts, to be able
 * to restart it later if needed.
 *
 * @author Dave Syer
 *
 */
public class RestartListener implements SmartApplicationListener {

	private ConfigurableApplicationContext context;

	private ApplicationPreparedEvent event;

	@Override
	public int getOrder() {
		return 0;
	}

	@Override
	public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
		return ApplicationPreparedEvent.class.isAssignableFrom(eventType)
				|| ContextRefreshedEvent.class.isAssignableFrom(eventType)
				|| ContextClosedEvent.class.isAssignableFrom(eventType);

	}

	@Override
	public boolean supportsSourceType(Class<?> sourceType) {
		return true;
	}

	@Override
	public void onApplicationEvent(ApplicationEvent input) {
		if (input instanceof ApplicationPreparedEvent) {
			this.event = (ApplicationPreparedEvent) input;
			if (this.context == null) {
				this.context = this.event.getApplicationContext();
			}
		}
		else if (input instanceof ContextRefreshedEvent) {
			if (this.context != null && input.getSource().equals(this.context)
					&& this.event != null) {
				this.context.publishEvent(this.event);
			}
		}
		else {
			if (this.context != null && input.getSource().equals(this.context)) {
				this.context = null;
				this.event = null;
			}
		}
	}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring-cloud 导致应用收到多次ApplicationPreparedEvent 的相关文章

  • 微信表情的字符编号完整版【图文并茂哦!】

    图文并茂哦 Emoji表情的分类 微信表情的字符编号完整版 NLP神经网络实现在伪原创方面的运用NLP伪原创技术早期并不是很受欢迎基于主动学习的伪原创句法识别研究小发猫 人工智能的伪原创工具小发猫与普通伪原创工具的区别自媒体如何快速伪原创
  • SVN——Previous operation has not finished;run 'cleanup' if it was interupted

    前言 小编在用svn更新代码更新的时候不小心关掉了客户端 导致出现如下问题 解决方案 客户端已经给出了解决模块 按照客户端的提示去做就好了 不过还是要查一下相关的内容 以免误操作造成更多不好的结果 按照如下图所示去操作就好 打开后是这个界面

随机推荐

  • css背景对话框

    ts height 108rpx width 528rpx background RGBA 46 48 61 1 border radius 8rpx position absolute top 50rpx left 54rpx after
  • iOS 15适配

    写的有点晚了哈 升级iOS15之后 有没有发现你的App导航栏上的状态栏颜色变了呢 navigationBar if available iOS 15 0 UINavigationBarAppearance appearance UINav
  • [Angular]快速将Bootstrap4引入Angular9

    目录 创建一个Angular项目 Angular里面引入bootstrap 方法一 直接引用 方法二 npm安装 Angular添加表单 优化 参考链接 创建一个Angular项目 安装Node js 安装Angular CLI 使用命令行
  • unity 智能巡逻兵

    unity 智能巡逻兵 一 游戏要求 游戏设计要求 创建一个地图和若干巡逻兵 使用动画 每个巡逻兵走一个3 5个边的凸多边型 位置数据是相对地址 即每次确定下一个目标位置 用自己当前位置为原点计算 巡逻兵碰撞到障碍物 则会自动选下一个点为目
  • 关于Spring属性编辑器详解

    最近刚在研究Spring的编辑器 发现很有意思 刚好galaxystar起了一个这样贴 我想对PropertyEditor作一个详细的整理会对大家有益 特定启了这个新帖 所谓的PropertyEditor 顾名思义 就是属性编辑器 由于Be
  • Nginx配置汇总

    一 Nginx概念 Nginx是目前负载均衡技术中的主流方案 几乎绝大部分项目都会使用它 Nginx是一个轻量级的高性能HTTP反向代理服务器 同时它也是一个通用类型的代理服务器 支持绝大部分协议 如TCP UDP SMTP HTTPS等
  • hadoop.2.6.0安装hive.1.2.2

    文章目录 1 hadoop 2 6 0的安装 2 hive 1 2 2的安装 2 1 前提 2 2 解压 错误1 提示 1 hadoop 2 6 0的安装 参考 https blog csdn net qq 21383435 article
  • 请别再问我Spark的MLlib和ML库的区别

    机器学习库 MLlib 指南 MLlib是Spark的机器学习 ML 库 其目标是使实际的机器学习可扩展和容易 在高层次上 它提供了如下工具 ML算法 通用学习算法 如分类 回归 聚类和协同过滤 特征提取 特征提取 转换 降维和选择 管道
  • sharding-jdbc系列(一):概念

    前话 前段时间公司项目比较忙 天天都忙于码代码 最近好不容易项目上线了 后期就是试运行解决线上问题 要闲一些了 看了下公司以前的一些项目 发现其中居然有用到sharding jdbc 想到以前自己也使用过 但是仅仅是会用过 对一些原理还不了
  • antd pro component - EditableProTable 表单重置

    antd pro component EditableProTable 受控情况之下 改变 dataSource之后 但是表格编辑组件还是记录上次编辑状态记录的数据 没有及时更新 解决办法就是手动更新表单 其实整个表格就是一个form 开始
  • 数据分析36计(24):因果推断结合机器学习估计个体处理效应

    个体异质性为何重要 传统的因果推断分析 主要关注焦点是平均处理效应 Average Treatment Effect 许多科学和工程都会面临这样的挑战 从个性化的医疗救治方案 到定制型的营销建议都需要了解异质性处理效应 即个体层面的因果效应
  • 延时队列的几种实现方式(只有原理,并没有源码)

    延时队列 需求描述 场景一 在淘宝下了订单 过半个小时未支付就取消订单 场景二 还是淘宝 别问 问就是淘宝资深剁手党 发货后超过15天未确认就自动收货 需求分析 本质上都是超过xxx时间 就异步去做一件事 说到异步那基本上就是搞个定时任务去
  • 推荐 4 个本周 火火火火 的开源项目

    本期推荐开源项目目录 1 一个集成了主流 AI 大模型的 APP 2 模拟人类行为的小镇 3 离线 OCR 软件 4 流程图编辑框架 01 一个集成了主流 AI 大模型的 APP 该开源项目集成了主流的大语言模型 绘图模型 基于Flutte
  • 第七站:吃透JavaScript中的函数

    欢迎来到 JavaWeb的奇妙冒险 教学系列 在这里 我们将继续探索Web开发的精彩世界 本站将为你揭开JavaScript中变量的神秘面纱 让我们在学习的过程中既轻松愉快 又能掌握高质量的知识 准备好进入第七站的学习之旅了吗 让我们开始吧
  • 【C++11】右值引用和移动语义 万能引用和完美转发

    文章目录 1 右值引用和移动语义 1 1 左值引用和右值引用 1 2 右值引用的使用场景 1 3 新的类功能 2 万能引用与完美转发 2 1 万能引用的基本介绍和使用 2 2 完美转发 2 3 完美转发的实际应用场景 3 可变参数模板 3
  • C++继承(一)

    目录 继承方式 继承同名成员处理方式 父类与子类中都有相同的成员 继承同名静态成员处理方式 继承中的对象模型 继承中构造和析构函数 菱形继承 多继承语法 在多种接口需要相同输出时 C 的继承相对于传统方式更有利也更方便维护 C 继承语法 c
  • React + css3 实现circle圆环进度条加载

    需求效果图 如上图所示 需求 动态获取不同的分数 圆环展示对应的百分比分数值 正确率 70 以下提示文案 还需要继续加油哦 正确率 70 90 以下提示文案 不错 再加把劲 正确率 90 及以上提示文案 真棒 数据描述 不同的测试分数显示不
  • 如何用Git LFS管理超过50MB的文件

    首先说明 Github对文件上传尺寸有50MB的限制 如果想要上传大于50MB的文件 必须用Git Large File System进行管理 一般情况下 超额的这部分大型文件是各种包啊什么的 比如Unity项目内的一些package 本身
  • Spring IOC的实现机制

    1 什么是Spring IOC Spring IOC Inversion of Control 控制反转 是Spring框架的核心特性之一 它是一种设计模式 通过该模式 对象的创建 依赖注入和生命周期管理等操作由容器负责 而不是由程序员手动
  • Spring-cloud 导致应用收到多次ApplicationPreparedEvent

    最近排查发现DubboComponent被重复注册 怀疑ApplicationPreparedEvent收到了多次 public final class DubboConfigApplicationListener implements A