JMeter中不使用定时器实现120~180秒随机Pacing的方法
无定时器实现120~180秒随机Pacing间隔方案
你完全可以不用任何定时器组件,通过脚本后置处理器实现需求,不需要给10个采样器逐个重复配置,具体操作如下:
核心逻辑
Pacing的本质是采样器执行完成后、下一个采样器启动前的等待间隔,我们只需要在采样器执行结束的节点,生成120~180秒范围内的随机值,阻塞对应时长即可。优先推荐用JSR223+Groovy实现,性能远高于BeanShell,如果你一定要用BeanShell,脚本逻辑完全通用。
操作步骤
- 先把10个需要加Pacing的采样器放到同一个简单控制器下(如果这10个采样器就是线程组下的全部组件,直接操作线程组即可,不用额外加控制器)
- 选中这个父容器(装了10个采样器的简单控制器/对应线程组),右键添加「后置处理器 -> JSR223 PostProcessor」,这个组件的作用域会自动覆盖容器下的所有10个采样器,不用逐个配置
- 语言选择
groovy(JMeter官方推荐的脚本语言,会编译缓存,高并发压测下性能远好于BeanShell),在脚本输入框粘贴对应代码即可
脚本1:采样器结束后硬等120~180秒
也就是不管采样器本身跑了多久,执行完就等120到180秒的随机时间,再跑下一个采样器:
// 生成120000毫秒(120秒)到180000毫秒(180秒)的随机等待时长 long waitMs = (long) (120000 + Math.random() * 60000); // 阻塞等待 Thread.sleep(waitMs);
如果你要的是**相邻两个采样器的启动间隔落在120180秒区间**(即把采样器自身的执行耗时算进间隔里,而不是采样器跑完之后额外等满120180秒),用下面的脚本即可:
// 获取当前刚执行完的采样器自身耗时 long samplerCostMs = prev.getTime(); // 生成120~180秒的随机总间隔 long totalPacingMs = (long) (120000 + Math.random() * 60000); // 计算实际需要等待的时长,如果采样器本身执行已经超过总间隔,就不再等待 long realWaitMs = totalPacingMs - samplerCostMs; if (realWaitMs > 0) { Thread.sleep(realWaitMs); }
BeanShell版本实现
和你猜测的路径一致,如果要使用BeanShell实现,只需要在添加后置处理器的时候选择「BeanShell PostProcessor」,脚本内容和上面完全一致,直接粘贴即可。注意BeanShell是解释执行,高并发压测场景下性能损耗会比Groovy高很多,非必要不推荐。
注意事项
- 确认JSR223/BeanShell后置处理器的作用域只覆盖你需要加Pacing的10个采样器,不要误覆盖其他无关组件
- 如果后续要调整Pacing范围,直接修改代码里的数值即可:基础等待时长是最小值对应的毫秒数,随机范围是(最大值-最小值)对应的毫秒数
- 这种实现方式完全不依赖任何定时器组件,效果和Throughput Timer一致,逻辑完全可控
内容的提问来源于stack exchange,提问作者Krishna Sriram
相关产品推荐
相关产品推荐

