JMeter线程组3线程循环1次时如何按AB顺序执行HTTP请求?
解决JMeter线程组AB顺序执行与Azure SignalR连接问题
先解决B复用ID的核心问题
你现在的问题本质是变量没做线程隔离——如果A生成的连接ID存在了全局变量里,所有线程都会拿最后那个值。换成线程局部变量就搞定:
- A请求里存ID的时候,别用全局的
__setProperty(),直接用vars.put("connectionId", "生成的ID"),每个线程会有自己独立的变量副本。 - B请求里直接引用
${connectionId},这样每个B只会用自己线程A生成的ID,不会串。
这时候每个线程都是独立跑A→B,虽然线程并行启动看起来像AAABBB,但逻辑上每个B对应自己的A,完全满足ID复用的需求,而且3个线程对应3个Azure SignalR连接,测试结束后都会保持打开,符合压力测试的要求。
如果必须严格按ABABAB的顺序执行
要是非得让线程1跑完A→B,再线程2跑A→B,再线程3,用这俩方法:
方法一:用同步定时器强制串行
- 在A请求前面加个
Synchronizing Timer,把「Number of Simultaneous Users to Group by」设成1。这样每次只允许1个线程进入执行流程。 - 每个线程里的顺序是:同步定时器 → A → B。线程会排队依次执行,完美实现ABABAB的顺序,而且每个线程执行完不会立刻关连接,最终3个连接都保持打开。
方法二:给线程加启动延迟
- 在线程组的「Thread Delay」里填
${__threadNum}*1000,意思是线程1立刻启动,线程2延迟1秒,线程3延迟2秒。 - 调整延迟时间(比如把1000改成2000),保证前一个线程的B跑完,下一个线程再启动A,就能接近ABABAB的顺序。
适配Azure SignalR的连接保持
- 所有HTTP请求都要开「Keep-Alive」:在HTTP请求的「Advanced」标签里勾上
Use keepalive,确保连接不会随请求结束就关。 - 检查Azure SignalR的连接超时配置,别让测试过程中连接被提前踢掉。这样3个线程对应3个独立连接,测试结束后都能保持打开,满足压力测试的要求。
内容的提问来源于stack exchange,提问作者Nour Mawla
相关产品推荐
相关产品推荐

