JMeter多线程组中InterThreadPreProcessor变量复用问题求助
JMeter测试计划结构
Test Plan ├─ Http Cookie ├─ Http Cache └─ CSV CONFIG file(含firstname列,共1000条记录) TG1-1000(线程组,1000线程) ├─ Sampler 1 ├─ Sampler 2(引用CSV中的firstname) │ ├─ 正则表达式提取器(从Sampler2响应提取数据) │ └─ 跨线程组后置处理器(将{empid}存入fifo_Sync队列) └─ Sampler 3 TG2-1000(线程组,1000线程) ├─ Sampler 1 ├─ Sampler 2(传入CSV的firstname执行搜索) │ └─ 跨线程组前置处理器(从fifo_Sync取出empid) ├─ Sampler 3 │ └─ 跨线程组前置处理器(尝试从fifo_Sync取empid,需在Sampler3中复用) └─ ... TG3-1000(线程组,1000线程) ├─ Sampler 1 ├─ Sampler 2 └─ Sampler 3
问题
在TG2的Sampler 2中使用InterThreadPreProcessor获取empid变量后,fifo_Sync队列已被清空,导致Sampler 3无法复用该empid变量,该如何处理?
解决方法
方案1:把empid存入当前线程的本地变量
在TG2中,拿到empid的跨线程组前置处理器之后,添加一个BeanShell后置处理器,将empid值存入本地线程变量(比如local_empid):
// 把获取到的empid存入本地变量 vars.put("local_empid", vars.get("empid"));
之后Sampler 3直接引用${local_empid}即可,不用再从fifo_Sync队列读取。
方案2:修改跨线程通信插件的读取策略
如果你的InterThreadCommunication插件支持,将队列读取模式从FIFO(取出即删除)改为复制读取(保留队列中的empid不删除)。但要注意,这种方式需要TG1生成的empid数量足够TG2所有线程重复读取,避免出现队列空的情况。
方案3:用全局属性存储firstname与empid的映射
在TG1的跨线程组后置处理器中,不要只存empid到队列,而是把firstname和empid的对应关系存入JMeter全局属性:
// 将firstname和empid的映射存入全局属性 props.put("empid_" + vars.get("firstname"), vars.get("empid"));
然后在TG2的Sampler 2和Sampler 3之前,添加BeanShell预处理器,通过当前线程的firstname获取对应的empid:
// 根据firstname从全局属性取empid String empid = props.get("empid_" + vars.get("firstname")); vars.put("empid", empid);
这种方式不依赖队列,通过唯一标识关联数据,可靠性更高。
方案4:离线存储empid后再执行TG2
让TG1先完成所有empid的生成,将firstname和empid写入新的CSV文件,然后TG2直接读取这个新CSV的empid列:
- 在TG1末尾添加BeanShell后置处理器,把数据写入CSV:
// 写入到指定路径的CSV文件 FileWriter writer = new FileWriter("empid_mapping.csv", true); writer.write(vars.get("firstname") + "," + vars.get("empid") + "\n"); writer.close();
- 在Test Plan中开启独立运行每个线程组选项,确保TG1执行完再启动TG2。
- TG2添加新的CSV配置文件,读取
empid_mapping.csv中的empid列,直接在Sampler中引用即可。
内容的提问来源于stack exchange,提问作者Neelima
相关产品推荐
相关产品推荐

