You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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代码和上面一致

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 09:07:26