JMeter后台同步请求并行执行异常问题及优化方案咨询
JMeter同步场景问题修复及替代实现方案
一、用户详情重复问题修复
你的核心问题是全局props被多线程覆盖:props是JMeter的全局属性,所有线程共享,当多个用户登录时,后登录的用户会覆盖props里的令牌、用户ID,导致第二个线程组的所有线程都拿到最后一个用户的信息,出现重复。修复方案如下:
为每个线程单独存储用户数据
- 登录线程组中,提取令牌和用户ID后,结合线程编号用
__setProperty函数存储:- 存储令牌:
${__setProperty(token_${__threadNum},${token},)}(${token}为你提取的令牌变量) - 存储用户ID:
${__setProperty(userId_${__threadNum},${userId},)}(${userId}为你提取的用户ID变量)
- 存储令牌:
- 同步线程组中,获取对应线程的用户数据:
- 获取令牌:
${__P(token_${__threadNum},)} - 获取用户ID:
${__P(userId_${__threadNum},)}
- 获取令牌:
- 登录线程组中,提取令牌和用户ID后,结合线程编号用
调整登录等待逻辑为线程独立判断
不要用全局的login=true作为while循环的判断条件,改为每个线程独立的登录状态:- 登录线程组中,登录成功后设置当前线程的属性:
${__setProperty(loggedIn_${__threadNum},true,)} - 同步线程组的while循环条件改为:
${__jexl3(${__P(loggedIn_${__threadNum},false)} != true,)},确保每个线程只等待自己的登录完成。
- 登录线程组中,登录成功后设置当前线程的属性:
二、其他同步场景实现方法
除了双线程组的方式,还有几种更简洁的实现思路:
方法1:同一线程组内实现并行+定时循环
不需要拆分线程组,在同一个线程组内完成登录、主业务请求、同步请求的并行:
- 添加
Parallel Controller(需通过JMeter插件管理器安装"Parallel Controller and Samplers") - Parallel Controller下分两个分支:
- 分支1:放置你的主业务请求流程
- 分支2:复用登录后的线程变量,添加
Loop Controller(循环次数设为5),里面放同步请求,再添加Constant Timer(设置60000毫秒),确保每次同步请求间隔60秒。
这种方式下每个线程的用户数据都是独立的,不会出现覆盖问题。
方法2:单线程组内用Loop+定时器实现
如果不需要和主请求严格并行,只是同步请求每60秒执行一次:
- 登录请求完成后,添加
Loop Controller(循环次数设为5) - 循环控制器内放置同步请求,然后添加
Constant Timer,设置60000毫秒,这样每次同步请求执行后等待60秒再执行下一次。 - 主业务请求可根据需求放在循环控制器外或调整执行顺序。
方法3:使用Test Action Sampler控制等待
在同步线程组中,用Test Action Sampler替代while循环的等待逻辑:
- 同步线程组启动后,先执行Test Action Sampler,通过
__jexl3判断当前线程的登录状态,未登录则设置"Duration (ms)"为1000(等待1秒)后重试,避免空转占用资源 - 确认登录状态后,添加Loop Controller执行5次同步请求,每次请求后添加Test Action Sampler设置等待60000毫秒。
内容的提问来源于stack exchange,提问作者Sasith Bandara
相关产品推荐
相关产品推荐

