JMeter负载测试中每10分钟自动更新授权令牌问题排查
JMeter实现每10分钟自动刷新授权令牌方案
现有代码的问题
你当前的逻辑存在几个关键错误:
- 时间变量使用不当:在JSR223脚本中直接嵌入
${__time(,)}会导致语法解析问题,Groovy脚本应优先使用原生API获取时间。 - 时间差阈值错误:你设置的判断条件是
diff>=100(100毫秒),但实际需要的是10分钟(600000毫秒),数值完全不符。 - 未处理初始值为空的情况:如果
startTime变量未提前初始化,第一次执行时vars.get("startTime")会返回null,直接调用toLong()会抛出空指针异常。 - 冗余的flag变量:没必要通过中间变量
flag传递判断条件,直接在If Controller中计算时间差更高效。
修正后的实现步骤
1. 初始化起始时间
在测试计划的用户定义变量中添加startTime,值设为${__time(,)},确保脚本启动时就有初始时间戳。
2. 修改JSR223 Post Processor脚本
替换原有代码为以下内容(放在需要触发令牌刷新的请求之后,比如主API请求的Post Processor):
// 获取起始时间,处理空值情况 def startTime = vars.get("startTime") ?: System.currentTimeMillis().toString() long currentTime = System.currentTimeMillis() long diff = currentTime - startTime.toLong() // 10分钟 = 600000毫秒 if (diff >= 600000) { // 更新起始时间为当前时间 vars.put("startTime", currentTime.toString()) // 设置刷新标记 vars.put("needRefreshToken", "true") } else { vars.put("needRefreshToken", "false") } log.info("距上次令牌刷新已过 ${diff/1000} 秒,是否需要刷新:${vars.get("needRefreshToken")}")
3. 配置If Controller
将授权请求放在If Controller下,设置条件为:
${__groovy(vars.get("needRefreshToken") == "true" || vars.get("auth_token") == null,)}
这个条件会在两种情况触发授权请求:一是首次运行还没有令牌,二是时间差达到10分钟需要刷新。
4. 提取并传递新令牌
在授权请求的正则表达式提取器或JSON提取器中,将返回的令牌提取到auth_token变量(比如从响应JSON的access_token字段提取)。然后在所有需要授权的API请求的Authorization Header中使用Bearer ${auth_token}(根据你的认证类型调整)。
5. 注意事项
- 确保JSR223脚本的语言选择为Groovy,并勾选"Cache compiled script if available"提升性能。
- 如果是多线程负载测试,每个线程会维护自己的
startTime和auth_token变量,确保每个线程独立刷新令牌。
内容的提问来源于stack exchange,提问作者HopefullyHelpful
相关产品推荐
相关产品推荐

