一不小心,就踩了 tomcat 的这个坑
小伙伴们好呀,今天 4ye 又来聊 bug 了 哈哈哈,感觉自己有很多坑货🕳 😂
如果你在开发中也遇到这个问题 org.apache.tomcat.jni.SSL.renegotiatePending(J)I ,并且网上说的升级 Springboot 之类的方法没用的话,那你可能和 4ye 一样踩到了这个坑🕳
问题描述
在开发时,发现同事都能正常运行开发环境,可到了我这里,却老是抛出这个异常 renegotiatePending(J)I ,连登录都登录不了 😱
而且这已经不是我第一次遇到这个问题了,之前在别的项目中也遇到过,不过可以关闭那个 https ,对本地开发还是没啥影响的
但是现在又来了,这难道就是墨菲定律😱
一开始我以为是 JDK 的版本和大家的不一样造成的,毕竟大家的代码都一样🐖
可是修改了好几次 JDK ,问题任然存在。没办法,只能继续百度自救😱
救星
终于,我在一篇博客中看到不一样的观点
https://www.cnblogs.com/jinzhihang/p/11906469.html (感谢博主!)😝
看到这个什么 tomcat native 我还很懵,想着这东西是啥?
Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。
Tomcat Native 是利用 APR 来提升Tomcat性能的本地API。
—— 《百度百科》
好吧,不过对这个东西真是一点印象都没有 🐖
只能翻一下官方文档了解下这个 APR 了
https://tomcat.apache.org/tomcat-9.0-doc/index.html
https://tomcat.apache.org/tomcat-9.0-doc/apr.html
可以看到官网的介绍中有以下几个要点
-
Apache HTTP Server 2.x 的核心 -
高级IO功能(如sendfile, epoll和OpenSSL) -
操作系统级别的功能(随机数生成,系统状态等) -
本地进程处理(共享内存,NT管道和Unix套接字)
再往下看,可以看到这里说,如果这个库已经正确安装,那么它会被自动使用
到了这里就不难猜测了。
应该是其他同事的电脑没装过这个库,或者还有很多或者 😝
解决
得知同事没有出现下面的这个 log 后
o.a.catalina.core.AprLifecycleListener : An older version [1.2.17] of the Apache Tomcat Native library is installed, while Tomcat recommends a minimum version of [1.2.23]
……
我便肯定了自己的电脑中肯定有装过这个东西了,至于是什么时候的我便不记得了🐖
windows 下这个库文件叫做 tcnative-1.dll
。
我这里用 everything 去进行模糊搜索 ,注意正则语法🐖
同时在电脑的环境变量中发现这个 TOMCAT_HOME 配置。
我都忘了为啥配置这个东西了🐖。
debug
在好奇心的驱使下,我又开始 debug 这个源码了,还没好好看过 Spring 内嵌 Tomcat 的启动过程,这次也是粗略过了下,就不记录先了 ✍
不知道小伙伴们平时有没有注意过这个启动日志~ 🐖
留意下,后面基本都不看 哈哈 ,如果在这一片 绿色( info 级别) 的日志中,没有其他很突兀的颜色(warn,error 级别)的出现,就更不会看了。这次也是吃了这个大亏!
启动日志还是很重要的,特别是当只有你的机器有问题时,可以拿来和大家对比下,说不定能更快解决问题。
在 debug 的过程中,我发现这个 AprLifecycleListener 会调用这个 init 方法,而这个方法会去加载 library ,但是最后调用到了这个 native 方法,就没再跟踪下去了,但是该调用结束后就多了上面那些 info 信息了。🐖
这个 bug 的解决也很简单,如果不需要可以直接去掉这个 tomcat 的环境变量 TOMCAT_HOME ,或者干脆删掉或给这个 tcnative-1.dll
修改名字。
总结
如果就你的开发环境不正常,记得看看这个启动过程的 log ,说不定会有一些新的发现~ 😝
我是4ye 咱们下期 应该…… 很快再见!! 😆