如何在JMeter中实现多线程暂停至SamplerA执行一次后恢复?
嘿,这个场景用JMeter自带的控制器加上全局属性就能轻松实现,我给你一步步拆解具体方案:
实现JMeter多线程等待单次采样器执行的方案
1. 先初始化全局标记属性
首先在Test Plan的最根节点下(所有线程组之前)加一个JSR223 Sampler,用来初始化一个全局的执行标记,脚本写:
// 初始化全局属性,标记SamplerA还没执行过 props.put("samplerAExecuted", "false")
这个采样器只会在测试启动时跑一次,确保全局标记的初始状态正确。
2. 配置核心线程组
添加一个Thread Group,直接把线程数设为5,Ramp-Up时间可以设为0(让5个线程立刻启动,要是你需要慢慢启动也可以调整),循环次数根据你的测试需求来设置就行。
3. 确保SamplerA只执行一次
在线程组里加一个Critical Section Controller——这个控制器的作用就是同一时间只允许一个线程进入里面的逻辑,刚好能帮我们实现SamplerA仅执行一次的需求:
- 在这个临界区控制器里,再加一个If Controller,条件写:
意思是只有当SamplerA还没执行过的时候,才进入下面的逻辑。${__jexl3(${__property(samplerAExecuted)} == "false",)} - 然后在If Controller里放两个东西:
- 你的SamplerA(就是需要只执行一次的那个采样器,比如HTTP请求、JDBC请求啥的)
- 另一个JSR223 Sampler,脚本写:
// 标记SamplerA已经执行完,把全局属性改成true props.put("samplerAExecuted", "true")
4. 让所有线程暂停等待
在线程组里(和临界区控制器同级)加一个While Controller,条件写:
${__jexl3(${__property(samplerAExecuted)} == "false",)}
这个控制器会让线程一直循环,直到全局标记变成true,也就是SamplerA执行完为止。
在While Controller里面加一个Test Action Sampler,把"Duration (ms)"设为1000——这个采样器啥实际请求都不发,就是让线程每秒检查一次全局标记的状态,避免占用太多CPU,你也可以根据需求调整这个等待时长。
5. 添加后续执行的业务逻辑
最后,在线程组里把你需要所有线程恢复后执行的采样器(比如各种业务请求、断言、监听器啥的)放在While Controller后面就行。
整个流程跑起来是这样的:
- 测试启动,全局标记被初始化为
false - 5个线程同时启动,每个线程都会先碰临界区控制器:
- 第一个抢到临界区的线程会通过If判断,执行SamplerA,然后把全局标记改成
true - 剩下的4个线程进到临界区后,If判断不成立,直接跳过SamplerA
- 第一个抢到临界区的线程会通过If判断,执行SamplerA,然后把全局标记改成
- 所有线程都进到While控制器里循环等待,直到全局标记变成
true - 一旦SamplerA执行完、全局标记更新,所有线程立刻跳出等待,一起执行后面的业务逻辑
这样就完全实现了你要的场景:5个线程启动后暂停,直到其中一个执行一次SamplerA,之后所有线程恢复执行。
内容的提问来源于stack exchange,提问作者Hexgear
相关产品推荐
相关产品推荐

