JMeter多请求场景下如何避免HashMap被覆盖的问题
问题根源
- 你的代码每次执行后置处理器时都会新建空白HashMap,没有读取之前已经存入
idMap变量的历史数据,直接用新的单键值对覆盖了原有的idMap值,所以最终只会保留最后一次请求的写入结果。
修复方案
逻辑调整为:每次执行时先读取已存在的idMap数据,在已有数据基础上追加新的键值对,不存在历史数据时再初始化新的Map。
修改后代码如下:
import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; HashMap map; JSONParser parser = new JSONParser(); // 先尝试读取已有的历史idMap String oldIdMapStr = vars.get("idMap"); if (oldIdMapStr != null && !oldIdMapStr.isEmpty()) { // 存在历史数据,先转为JSONObject再转成Map JSONObject oldJson = (JSONObject) parser.parse(oldIdMapStr); map = new HashMap(oldJson); } else { // 无历史数据,新建空Map map = new HashMap(); } // 追加当前请求的键值对 map.put(extID, intID); // 转为JSON字符串存回JMeter变量 JSONObject object = new JSONObject(map); vars.put("idMap", object.toString()); // 后续需要使用最新的idMap可直接读取 JSONObject json = (JSONObject) parser.parse(vars.get("idMap"));
注意事项
- 要保证每次存入的键
extID全局唯一,如果出现重复的extID,同一个键的旧值还是会被新值覆盖 - 上述逻辑中使用的
vars是JMeter线程局部变量,不同线程的idMap互相独立,如果需要全线程共享的全局Map,可替换为props存储 - 性能优先场景更推荐使用JSR223后置处理器+Groovy语言实现相同逻辑,执行效率远高于Beanshell
内容的提问来源于stack exchange,提问作者AH1993
相关产品推荐
相关产品推荐

