JMeter中如何每30分钟执行登录并传递令牌至后续请求
解决JMeter令牌30分钟过期的定时刷新方案
方案一:独立线程组处理令牌刷新(推荐)
这种方式让令牌刷新和业务请求完全隔离,互不影响,实现逻辑最清晰。
1. 调整测试结构
创建两个独立线程组:
- 主业务线程组:负责持续运行API_1到API_4
- 令牌刷新线程组:专门定时生成并更新登录令牌
2. 配置令牌刷新线程组
- 线程数:1
- 循环次数:5(启动时执行1次登录,之后每30分钟刷新1次,2小时共需4次刷新,加启动那次总共5次)
- 添加以下组件:
- Once Only Controller:包裹第一次Login请求,确保线程组启动时立刻执行登录
- Login请求:保持原有配置,提取令牌后添加JSR223 PostProcessor,将令牌存入JMeter全局属性:
(假设你用props.put("auth_token", vars.get("token"))token作为提取令牌的变量名) - 循环控制器:设置循环次数为4(对应后续4次令牌刷新)
- 循环控制器内添加Constant Timer,设置延迟时间为
30*60*1000毫秒(30分钟) - 添加Login请求:同样提取令牌并更新全局属性,PostProcessor代码和上面一致
- 循环控制器内添加Constant Timer,设置延迟时间为
3. 配置主业务线程组
- 线程数:根据你的并发需求设置
- 循环次数:勾选「永远」
- 添加Duration Timer:设置持续时间为
2*60*60*1000毫秒(2小时),确保线程组运行满2小时后自动停止 - 修改API_1到API_4的请求头/参数:将原来引用线程变量的地方改为引用全局属性,用
${__P(auth_token,)}获取最新令牌
方案二:主线程组内嵌入定时刷新逻辑
如果不想新增线程组,可在主业务线程组内通过逻辑判断实现令牌定时刷新。
1. 修改主业务线程组结构
- 在API请求上方添加JSR223 Sampler,命名为「检查并刷新令牌」
- 保留原有的Once Only Controller和Login请求(确保启动时获取第一次令牌)
2. JSR223 Sampler代码(Groovy)
// 初始化上次刷新时间,第一次运行时设为当前时间 if (!props.containsKey("last_refresh_time")) { props.put("last_refresh_time", System.currentTimeMillis()) } def currentTime = System.currentTimeMillis() def refreshInterval = 30 * 60 * 1000 // 30分钟对应的毫秒数 // 判断是否需要刷新令牌 if (currentTime - props.get("last_refresh_time") >= refreshInterval) { // 调用Login请求并更新令牌 def loginSampler = ctx.getTestPlan().getTestElementByName("Login") loginSampler.sample() // 更新全局属性和刷新时间 props.put("auth_token", vars.get("token")) props.put("last_refresh_time", currentTime) }
关键注意事项
- 必须用JMeter全局属性传递令牌:线程变量仅在当前线程内生效,全局属性可跨线程组共享,确保所有业务线程都能拿到最新令牌
- 避免使用Flow Control Action:它会阻塞当前线程,导致业务请求暂停,而独立线程组或定时判断的方式不会影响业务请求的持续运行
内容的提问来源于stack exchange,提问作者Deepak Parmar
相关产品推荐
相关产品推荐

