百摩网
当前位置: 首页 生活百科

springboot-jar启动很慢(记一次SpringBoot启动异常)

时间:2023-06-01 作者: 小编 阅读量: 1 栏目名: 生活百科

本文主要来记录一下,如果没有百度在自己的项目启动就抛开一些奇怪的问题,或者有一些奇奇怪怪的问题,靠自己怎么排查问题,另一种引擎去清除所有的问题都能够通过搜索来解决。除了力,那我们就只剩下:“异常信息、来源、和自己的经验”。项目框架用的是SpringBoot,然后集成WebSocket就行,在集成的过程中,其中有一步需要配置一个Bean。

  • 一、引言
  • 二、问题分析
  • 三、解决问题
  • 四、划重点

一、引言

小编最近接了个成功的服务端项目,在他们项目中集成了一个WebSocket,嗯,其实不难,有很多成功案例。

本文主要来记录一下,如果没有百度在自己的项目启动就抛开一些奇怪的问题,或者有一些奇奇怪怪的问题,靠自己怎么排查问题,另一种引擎去清除所有的问题都能够通过搜索来解决。

除了力,那我们就只剩下:“异常信息、来源、和自己的经验”

项目框架用的是SpringBoot,然后集成WebSocket就行,在集成的过程中,其中有一步需要配置一个Bean。

@Componentpublic class WsConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {ServerEndpointExporter serverEndpointExporter = new ServerEndpointExporter();return serverEndpointExporter;}}

然后在项目启动的时候抛出了异常信息:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serverEndpointExporter' defined in class path resource [org/springblade/modules/hol/config/WsConfig.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: javax.websocket.server.ServerContainer not availableat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1769)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:514)at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:321)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:319)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:863)at org.Springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744)at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391)at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:140)at org.springblade.core.launch.BladeApplication.run(BladeApplication.java:50)at org.springblade.Application.main(Application.java:18)Caused by: java.lang.IllegalStateException: javax.websocket.server.ServerContainer not availableat org.springframework.util.Assert.state(Assert.java:73)at org.springframework.web.socket.server.standard.ServerEndpointExporter.afterPropertiesSet(ServerEndpointExporter.java:107)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1828)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1765)... 16 common frames omitted

基于 Spring BootMyBatis PlusVue & Element 实现的后台管理系统用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

视频教程:https://doc.iocoder.cn/video/

二、问题分析

该类路径资源 [org/springblade/modules/hol/config/WsConfig.class] 中定义名称为“serverEndpointExporter”的 bean 创建错误:调用 init 方法失败;嵌套异常是 java.lang.IllegalStateException: javax.websocket.server.ServerContainer 不可用

通过异常的第一行就可以得知,是在 Spring 创建“serverEndpointExporter”beanW 的时候抛出来的,是这个配置类,原因是:ServerContainer 这个对象不可使用。

抛出异常的类是:AbstractAutowireCapableBeanFactory.java:1769

分析这里就可以得知,是在spring创建serverEndpoint的时候异常了, “那么异常的原因是Exporter ,为什么ServerContainer不可用呢?” 接下来分析

通过点击转换的源码信息:AbstractAutowireCapableBeanFactory.java:1769

protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {invokeAwareMethods(beanName, bean);return null;}, getAccessControlContext());}else {invokeAwareMethods(beanName, bean);}Object wrappedBean = bean;if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}try {invokeInitMethods(beanName, wrappedBean, mbd);}catch (Throwable ex) {throw new BeanCreationException(// 1769 这里就是1769行~~(mbd != null ? mbd.getResourceDescription() : null),beanName, "Invocation of init method failed", ex);}if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean;}

通过查看源码,是在1796行的catch里面抛出的异常的,catch是捕捉到invokeInitMethods这个异常的方法,然后才抛出来的,这样就可以开始调试了。

我们是在创建serverendpointExporter的,加一个筛选条件beanName为serverEndpointExporter,这样再过滤创建异常的其他bean。

断点卡好,下调试模式来启动项目,然后F5进到vokeInitMethods,单步往下执行。

最后执行到了 ((InitializingBean) bean).afterPropertiesSet(); 这行代码,bean方法对象是ServerEndpointExporter,调用了这个对象的afterPropertiesSet。

这个ServerEndpointExporterjava类,其中就有在获取serverPropertiesSet方法之后,首先调用这个getServerContainer方法获取serverContainer对象。

很明显这里返回的肯定是null,null != null 结果肯定是false,最后就是这样调用state(false,javax.websocket.server.ServerContainer not available)

通过state源知道,最后抛出这个异常:java.lang.IllegalStateContainerException: javax.websocket.server.server not available

基于 Spring Cloud AlibabaGatewayNacosRocketMQVue & Element 实现的后台管理系统用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

项目地址:https://gitee.com/zhijiantianya/yudao-cloud

视频教程:https://doc.iocoder.cn/video/

三、解决问题

通过这个文章上面的分析可以确认是因为ServerEndpoint类有一个对象为空的ExserverContainer,所以它会为空。

就需要,服务器容器这个对象是在哪里的,找源头就只有两个地方了,这就好办了。

public class ServerEndpointExporter extends WebApplicationObjectSupportimplements InitializingBean, SmartInitializingSingleton {@Nullableprivate List<Class<?>> annotatedEndpointClasses;@Nullableprivate ServerContainer serverContainer;// 有一个Set方法可以为serverContainer赋值public void setServerContainer(@Nullable ServerContainer serverContainer) {this.serverContainer = serverContainer;}@Nullableprotected ServerContainer getServerContainer() {return this.serverContainer;}// 有一个init方法可以为serverContainer赋值@Overrideprotected void initservletContext(ServletContext servletContext) {if (this.serverContainer == null) {this.serverContainer =(ServerContainer) servletContext.getAttribute("javax.websocket.server.ServerContainer");}}@Overridepublic void afterPropertiesSet() {Assert.state(getServerContainer() != null, "javax.websocket.server.ServerContainer not available");}}

通过IDEA的快捷方式,发现没有其他地方调用setServerContainer方法,那么只有init方法了,那么就断点卡在initServletContext方法了。

通过Bebug的能力发现,在从servletContext.getAttribute,根本就没有返回javax.websocket.ServerContainer,就是一个null的时候,结果就产生了异常给serverContainer,所以就产生了异常。

「那为什么javax.websocket.server.ServerContainer会不存在呢?」

这个类,原来是一个接口,那个ServerContainer肯定有的实现类,通过IDEA查看好人,到这个小编大概就明白了这个项目的其他jar包,引发了冲突。

最后到是哪个罐子最后突破了,直接通过IDEA功能就能够定位到,通过maven helper工具定位到maven引用位置,然后移除掉。

一下maven,项目就正常启动啦~~~~~~

四、划重点

本文针对某个异常、或者某个具体问题的另外来进行分析,分享解决这个异常的一个过程。

最开始的小井刚毕业那会,遇到个个,运气就过好,人都踩到这个了,解决这个问题,一时也找不到很多合适的文章,然后能力,然后话就坑了咋知道办。

肯定没有其他人通过自己的问题来解决问题,而且通过自己发现问题的过程来解决自己的问题。

也有很多小伙伴问过小编,学习一些框架源码有什么用?会用不就行了吗?

怎么办呢?真的会说到底怎么办呢,那么你的话,这些奇怪的东西是怎么实现的?深层次的理解。

久而久之之,遇到主动问题,你去摸索的第一个反应自己去百度,会直接为啥子看看的异常情况,分析一下不明的源头,再去学习,进行进行。

就这样不知不觉你的技术会慢慢升华,那个时候感觉就特别明显了。

原文链接:https://mp.weixin.qq.com/s/ppc0rwyhmenr33knyD5yDA

,
    推荐阅读
  • 足坛历史百大球星排名(世界足坛历史上的十大名帅)

    足球堪称世界第一运动,现代足球问世以来,一直深受人们的喜爱。其中,很多教练员为推动这项运动的发展作出了杰出的贡献。巴西人,被誉为"世界艺术足球之父"。等熟悉的名字,已成为多年来众多球迷心中大师级的球星偶像。先后率领科威特队、阿联酋队分别进军1982年和1990世界杯决赛。

  • 王子郁金香(郁金香紫衣王子)

    鳞茎偏圆锥形,直径约2-3cm,外被淡黄至棕褐色皮膜,内有肉质鳞片2-5片。叶大,3-5枚,带状披针形至卵状披针形,全缘并成波形。花单生茎顶,红色。生长习性王子郁金香属长日照花卉,性喜向阳、避风,冬季温暖湿润,夏季凉爽干燥的气候。要求腐殖质丰富、疏松肥沃、排水良好的微酸性沙质壤土。

  • 风水吉祥物知识(常见的四大风水吉祥物知识)

    风水吉祥物知识狗狗不仅是我们忠实的朋友,同时也具镇守门户之功、化煞消灾之效,宜摆在近门之处,狗头朝外。风水金龙鱼金龙鱼向来被认为是风水鱼,许多达官显贵、社会精英家中或办公室都摆放金龙鱼来招财化煞,消灾解难。从风水上考虑,金龙鱼有镇宅、治邪、带财的作用,被视为“趋吉避凶,招财进宝”的化煞吉祥物,所以深受生意人的喜爱。金字黑曜石八卦葫芦葫芦是古代行医者之用,可作为法器。

  • 草鱼和青鱼哪个难钓(这是草鱼还是青鱼)

    是那种渔具店里比较常见的酒泡嫩玉米,挂上两颗后,几开始死守了。差不多一个小时后,不经意的发现浮漂没了。以为看花眼了,仔细看了一下,这次很确定是黑漂了。好在野钓用的休闲竿比较软,但是不太担心鱼线会被切掉。将近二十分钟后,鱼基本上已经没力气挣扎了,这才抄上了岸。从体型上来说,应该是比较像草鱼和青鱼的,但是鱼鳞的大小和颜色却不一样。本文图片素材来源于钓友分享,侵权请联系删除!

  • 汽车表面污垢怎么清洗(怎么样可以清洗干净)

    鸟粪属于生物排泄物,相对来说,成分较简单,腐蚀性不强,清洁容易。不过,在处理时要分为两种。这时,仅仅打蜡已经不能处理,必须要使用专用于汽车清洗的磨砂纸,将油漆、油污清除,再用打蜡的方式恢复车面光泽。如果腐蚀严重,只能将整块漆翻新了。

  • 睡前喝牛奶能丰胸吗 睡前喝纯牛奶能丰胸吗

    牛奶富含蛋白质、乳脂,能帮助人体迅速吸收能量,缓解困倦现象。置放不得超过30分钟,以保最佳风味。

  • 乡村爱情第七季开播特别节目天津(乡村爱情为何拍到11部)

    《乡村爱情》就是这样的窗口平台,它有固定的收视人群,形成了一个稳定的系列,既能每年给公司带来不菲收益,也为本山大叔的一大堆徒弟带来了在荧幕上露脸的机会。所以说,《乡村爱情》能拍到11部,乃至后面12、13、14部,都是赵本山大叔的一片苦心,都是师傅对徒弟们的爱。

  • 痔疮出血怎么才能快速治好(痔疮出血怎么办)

    痔疮出血怎么办25岁小伙晕倒在厕所,原因居然是痔疮出血!25岁的黄杨(化名),已经反反复复便血一年多的时间了,他很清楚这应该是痔疮出血,由于每次的出血量不多,他也就没当一回事有一天他像往常一样上厕所,结果完事后刚站。

  • 每天敷矿泉水面膜好吗(经常敷水膜对肌肤到底有没有好处)

    但也有人认为,敷“水膜”没有任何作用,还容易导致肌肤多度水合,引发敏感。“水”的构成不同,对最终效果影响很大。这种“水膜”,除了水分,其他成分基本是零。因此,甄垚不建议用纯净水做水膜,对肌肤护理帮助不大。◆纯露一些精油爱好者,喜欢用各种纯露做水膜,希望借助纯露的力量,改善皮肤问题。这类爽肤水价格便宜,具有基础的保湿作用。综上,“水膜”本质上是一种自制简易面膜,制作简单,价格便宜。

  • 抱公主抱的技巧(公主抱的方式是什么)

    以下内容希望对你有帮助!抱公主抱的技巧面对女友的身侧,让她伸右手环住你的脖颈,左手交握右手形成环状。男士左手放于女友的肩胛骨下,手指收于女友左腋下,右手放于女友腿弯处。做好以上动作,两者同时用力,女友双臂收紧攀于男士颈项,将头、肩尽量靠尽男士左肩。男士腰腹用力,双臂向上勾,即可轻松完成横抱的动作。男士弯腰,将臂膀缓慢垂直地面,女孩即可轻松双脚落地。