SpringBoot内嵌Tomcat时执行业务在取Session卡住-与SecureRandom有关
问题
SpringBoot内嵌Tomcat启动业务后,业务请求时挂住
解决方案
使用java -jar -Djava.security.egd=file:/dev/./urandom 来指定生成器。
排查过程
- jstack打印堆栈,查找到有请求卡在Catalina生成session时,去读取SecureRandom,然后卡在一个FileInputStream的readByte的地方;就一直卡住了.
- 根据之前Tomcat启动很慢的,猜想可能是因为随机数生成;
- 上网查找看到提示要更改安全有关配置使用file:/dev/./urandom ,于是使用参数启动java -jar -Djava.security.egd=file:/dev/./urandom ...
- 结果测试果然正确没有卡住.
遗留问题
- 找了另一台CentOS的机子,一样的不使用参数启动,发现另外一台机子上启动速度就非常快,不需要加额外的参数也不会住住; 比较了两台的JRE上的java.secure设置,也是一样的,这就比较奇怪了,都不设置参数情况下,一台会卡住,另外一台不会?!是什么地方区别,待进一步查证。