某web应用负载均衡在两台机器上部署,其中一个节点tomcat无法启动原因分析

关注公众号 `N学无止界` 获取更多

  • 该问题产生的原因:
    • 直接原因:spring加载的时候获取配置文件的顺序在不同磁盘上结果不一致,导致“类加载出现异常",所以在有些磁盘环境下可以有些不可以,下面分析会说明原因。
    • 间接原因:spring配置文件配置重复
  • 解决办法:如下图 红色框内的配置是要注释掉的,否则在特别的情况下容易引起初始化出现异常。

  • 排查步骤(web是挂在磁盘,temp是本机磁盘)
  1. 分别启动web,temp 完全一样的Tomcat和工程,对比各自catalina.out内容,发现web出现缺少一个SQL的执行输出,继续观察不同之处,发现load spring顺序不一样(附件catalina.out-temp 是temp的Tomcat启动输出内容,附件catalina.out-web是web的Tomcat启动输出内容)
  2. 根据web.xml 配置和跟踪代码,找出来 spring是获取到所有配置后一个一个来实例化的

  1. 下面是写的打印出系统找到的spring配置文件,在test.jsp 页面打印出来(附件test.jsp-temp.txt是temp工程打印结果,附件test.jsp-web.txt 是web工程打印结果)

  1. 发现结果不一样,注释掉 springMvc-servlet.xml 中,发现工程可以正常运行(顺序还是不一样)。

---------------下面是翻查源码步骤(为什么加载顺序不一样)-----------------------------

  1. 下面是主调试入口函数:

  1. 调试跟踪堆栈(spring加载的时候堆栈)

  1. 上图可以看出,最终是由File.list() 列举出文件列表并获取满足条件的文件,下图解释了这个内部方法,所以引起了这种现象。

ps:linux文件管理跟windows有差距,但是该方法都是调用 native 方法实现。

  1. 总结:代码还是要规整起来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack_software

感谢打赏,我努力提供优质内容~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值