背景

生产环境有个功能点击后很慢。

前端调用后端接口是30秒,后端接口没能在30秒内返回。

现象

现象是在页面里点击某按钮,一直loading,后端也无法正常返回数据。

排查

去docker里执行如下

jps
jstack 1 > 1.log

查看线程信息 cat 1.log, 发现有这么一段

"executor-thread-20" #45 [48] daemon prio=5 os_prio=0 cpu=564.33ms elapsed=76.05s tid=0x00007fbb799d12e0 nid=48 runnable  [0x0
0007fbb5115e000]
   java.lang.Thread.State: RUNNABLE
	at java.io.FileInputStream.readBytes(java.base@21.0.7/Native Method)
	at java.io.FileInputStream.read(java.base@21.0.7/FileInputStream.java:287)
	at java.io.FilterInputStream.read(java.base@21.0.7/FilterInputStream.java:119)
	at sun.security.provider.NativePRNG$RandomIO.readFully(java.base@21.0.7/NativePRNG.java:432)
	at sun.security.provider.NativePRNG$RandomIO.ensureBufferValid(java.base@21.0.7/NativePRNG.java:535)
	at sun.security.provider.NativePRNG$RandomIO.implNextBytes(java.base@21.0.7/NativePRNG.java:554)
	- locked <0x00000000c09e4c88> (a java.lang.Object)
	at sun.security.provider.NativePRNG$Blocking.engineNextBytes(java.base@21.0.7/NativePRNG.java:274)
	at java.security.SecureRandom.nextBytes(java.base@21.0.7/SecureRandom.java:768)
	at org.apache.commons.lang3.CachedRandomBits.<init>(CachedRandomBits.java:67)
	at org.apache.commons.lang3.RandomStringUtils.random(RandomStringUtils.java:327)
	at org.apache.commons.lang3.RandomStringUtils.random(RandomStringUtils.java:286)
	at org.apache.commons.lang3.RandomStringUtils.next(RandomStringUtils.java:732)
	at org.apache.commons.lang3.RandomStringUtils.next(RandomStringUtils.java:692)
	at org.apache.commons.lang3.RandomStringUtils.nextAlphanumeric(RandomStringUtils.java:823)
	at xx.xxx.TokenProvider.createToken(TokenProvider.java:54)

而TokenProvider的第54行是在这样一个方法里。

import org.apache.commons.lang3.RandomStringUtils;

public staticString createToken() {
    // 下一行是第54行
    String r = RandomStringUtils.secureStrong().nextAlphanumeric(8);
    return UUID.randomUUID().toString().replace("-", "") + "-" + r;
}

很明显是这个secureStrong导致的。
修改为不安全的(此方法并发量并不高)。

String r = RandomStringUtils.insecure().nextAlphanumeric(8);

问题解决。