JMeter 中是不是有更多线程安全变量可用于 get() 和 set() 变量?

Posted

技术标签:

【中文标题】JMeter 中是不是有更多线程安全变量可用于 get() 和 set() 变量?【英文标题】:Is there a more thread safe variable available in JMeter to get() and set() variables?JMeter 中是否有更多线程安全变量可用于 get() 和 set() 变量? 【发布时间】:2019-07-31 20:22:11 【问题描述】:

随着更激进的负载,我注意到 2 个或更多线程设置完全相同的变量值,从而导致使用所述值的后续请求失败。我正在使用 JSR223 PostProcessor,其中有以下代码:

URL url = new URL(vars.get("response_url"));
String path = url.getFile();
vars.put("request_path", path);

在检查请求时,我发现有时一个线程将“request_path”设置为“example1”,而另一个线程将该变量设置为完全相同的值。我不想减少线程数或加速时间;这不是一个选择。

在 JMeter 中获取/设置变量时,是否有比“vars”更多的线程安全变量?还是有其他方法可以防止这种情况发生?

【问题讨论】:

您好,对回答有任何反馈吗?如果可以,请接受并投票,以便其他用户可以信任它,谢谢 【参考方案1】:

Vars 特定于 1 个线程(因此此处不需要线程安全),因此在核心 jmeter 中您所描述的不会发生。

如果某些 3rd 方插件发生这种情况,您应该向项目报告错误。

在出现问题时尝试进行线程转储以查看发生了什么

【讨论】:

【参考方案2】:

根据Top 8 JMeter Java Classes You Should Be Using with Groovy 文章vars 代表JMeterVariables 类实例,它又属于JMeterContext

如果您查看JMeterContextService 类源代码,您会看到JMeterContext 被声明为ThreadLocal 和Thread-Local Storage Pattern 意味着其他线程无法访问这些变量。

所以我建议使用Debug Sampler 或Sample Variables 属性检查$response_url 的来源,因为问题很可能与使用Groovy 代码中的vars 简写无关(你是using Groovy,你不是吗?)

【讨论】:

以上是关于JMeter 中是不是有更多线程安全变量可用于 get() 和 set() 变量?的主要内容,如果未能解决你的问题,请参考以下文章

JMeter 不同线程组间变量传递

JMeter学习(三十二)属性和变量

jmeter属性设置

jmeter随笔(23)--在csv中维护变量参数

线程同步和并发

Jmeter线程组创建及定义