vlambda博客
学习文章列表

一不小心,就踩了 tomcat 的这个坑

小伙伴们好呀,今天 4ye 又来聊 bug 了 哈哈哈,感觉自己有很多坑货🕳 😂

如果你在开发中也遇到这个问题 org.apache.tomcat.jni.SSL.renegotiatePending(J)I ,并且网上说的升级 Springboot 之类的方法没用的话,那你可能和 4ye 一样踩到了这个坑🕳

问题描述

在开发时,发现同事都能正常运行开发环境,可到了我这里,却老是抛出这个异常 renegotiatePending(J)I ,连登录都登录不了 😱

而且这已经不是我第一次遇到这个问题了,之前在别的项目中也遇到过,不过可以关闭那个 https ,对本地开发还是没啥影响的

一不小心,就踩了 tomcat 的这个坑

但是现在又来了,这难道就是墨菲定律😱

一不小心,就踩了 tomcat 的这个坑

一开始我以为是 JDK 的版本和大家的不一样造成的,毕竟大家的代码都一样🐖

可是修改了好几次 JDK ,问题任然存在。没办法,只能继续百度自救😱

救星

终于,我在一篇博客中看到不一样的观点

https://www.cnblogs.com/jinzhihang/p/11906469.html (感谢博主!)😝

一不小心,就踩了 tomcat 的这个坑

看到这个什么 tomcat native 我还很懵,想着这东西是啥?

Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。

Tomcat Native 是利用 APR 来提升Tomcat性能的本地API。

—— 《百度百科》

一不小心,就踩了 tomcat 的这个坑

好吧,不过对这个东西真是一点印象都没有 🐖

只能翻一下官方文档了解下这个 APR 了

https://tomcat.apache.org/tomcat-9.0-doc/index.html

一不小心,就踩了 tomcat 的这个坑

https://tomcat.apache.org/tomcat-9.0-doc/apr.html

一不小心,就踩了 tomcat 的这个坑

可以看到官网的介绍中有以下几个要点

  1. Apache HTTP Server 2.x 的核心
  2. 高级IO功能(如sendfile, epoll和OpenSSL)
  3. 操作系统级别的功能(随机数生成,系统状态等)
  4. 本地进程处理(共享内存,NT管道和Unix套接字)

再往下看,可以看到这里说,如果这个库已经正确安装,那么它会被自动使用

一不小心,就踩了 tomcat 的这个坑

到了这里就不难猜测了。

应该是其他同事的电脑没装过这个库,或者还有很多或者 😝

解决

得知同事没有出现下面的这个 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 的这个坑

同时在电脑的环境变量中发现这个 TOMCAT_HOME 配置。

一不小心,就踩了 tomcat 的这个坑

我都忘了为啥配置这个东西了🐖。

debug

在好奇心的驱使下,我又开始 debug 这个源码了,还没好好看过 Spring 内嵌 Tomcat 的启动过程,这次也是粗略过了下,就不记录先了 ✍

不知道小伙伴们平时有没有注意过这个启动日志~  🐖

留意下,后面基本都不看 哈哈 ,如果在这一片 绿色( info 级别) 的日志中,没有其他很突兀的颜色(warn,error 级别)的出现,就更不会看了。这次也是吃了这个大亏!

启动日志还是很重要的,特别是当只有你的机器有问题时,可以拿来和大家对比下,说不定能更快解决问题。

一不小心,就踩了 tomcat 的这个坑

在 debug 的过程中,我发现这个 AprLifecycleListener 会调用这个 init 方法,而这个方法会去加载 library ,但是最后调用到了这个 native 方法,就没再跟踪下去了,但是该调用结束后就多了上面那些 info 信息了。🐖

一不小心,就踩了 tomcat 的这个坑

这个 bug 的解决也很简单,如果不需要可以直接去掉这个 tomcat 的环境变量 TOMCAT_HOME ,或者干脆删掉或给这个  tcnative-1.dll 修改名字。

总结

如果就你的开发环境不正常,记得看看这个启动过程的 log ,说不定会有一些新的发现~ 😝

一不小心,就踩了 tomcat 的这个坑



一不小心,就踩了 tomcat 的这个坑



我是4ye 咱们下期 应该…… 很快再见!! 😆