JMeter:含动态名称的Parallel Controller从第二次迭代起执行失败
问题背景
使用Parallel Controller插件时,将控制器名称设置为ParaTrx2_${__Random(1,1000,uniqueID)}(包含动态生成的唯一ID),运行脚本时控制台抛出java.lang.RuntimeException: Attempting to reset the thread name错误;但改用Transaction Controller、或移除名称中的动态变量后,脚本可正常执行。需保留事务名中的唯一ID,同时解决报错。
可行解决方案
方案1:用线程ID替代随机数生成唯一标识
将控制器名称中的随机数变量替换为线程ID,比如:
ParaTrx2_${__threadNum}
每个线程的ID唯一,既能满足事务名区分需求,又不会触发线程名频繁变更的问题——Parallel Controller并行执行时会复用线程资源,动态随机数会导致线程名反复修改,触发JMeter内部的线程名重置限制,而线程ID是固定的,可避免这个问题。
方案2:提前生成全局唯一ID再引用
- 在测试计划的用户定义变量中添加变量,比如
globalUniqueID,值设为${__Random(1,1000,)} - 将Parallel Controller的名称设置为:
ParaTrx2_${globalUniqueID}
全局变量在测试计划初始化时就生成固定值,不会在Parallel Controller执行过程中动态修改名称,从而绕过线程名重置的限制,同时保证事务名的唯一性。
方案3:通过JSR223 PreProcessor动态设置控制器名称
- 在Parallel Controller下添加JSR223 PreProcessor
- 在脚本框中写入Groovy代码:
// 生成1-1000之间的随机数 def uniqueID = new Random().nextInt(999) + 1 // 设置Parallel Controller的名称 sampler.getParent().setName("ParaTrx2_" + uniqueID)
这种方式通过代码在控制器初始化阶段设置名称,避开直接在名称栏写动态变量导致的线程名冲突问题,同时保留随机唯一ID的需求。
报错原因
JMeter的Parallel Controller在并行执行时会复用线程池中的线程,如果控制器名称是动态生成的(每次迭代都变化),会导致线程名被频繁修改,触发JMeter内部的线程名重置保护机制,从而抛出Attempting to reset the thread name异常。而Transaction Controller是串行执行,不存在线程复用导致的名称变更冲突,因此可以正常运行。
内容的提问来源于stack exchange,提问作者khushal wadake

