2

我正在使用 jp@gc 的 Ultimate Thread Group 并且在线程组内我有一个 if 控制器确保只有每个其他线程/用户继续使用

(${__threadNum}%2==0) 

关闭线程似乎存在一些问题,因为在负载保持设定的时间后,我得到的错误与进入控制器的线程一样多。我不确定它们是关于什么的,它们似乎与 if 控制器的内容无关,因为即使在停用内部的所有内容后我也会得到它们。

我在 Windows 10 上使用带有 Ultimate Thread Group 2.1 的 jMeter 3.2。

错误消息:

java.lang.StackOverflowError: null
at java.lang.invoke.MethodHandles.insertArguments(Unknown Source) ~[?:1.8.0_131]
at jdk.internal.dynalink.DynamicLinker.createRelinkAndInvokeMethod(DynamicLinker.java:224) ~[nashorn.jar:?]
at jdk.internal.dynalink.DynamicLinker.link(DynamicLinker.java:201) ~[nashorn.jar:?]
at jdk.nashorn.internal.runtime.linker.Bootstrap.bootstrap(Bootstrap.java:208) ~[nashorn.jar:?]
at jdk.nashorn.internal.runtime.linker.Bootstrap.createDynamicInvoker(Bootstrap.java:371) ~[nashorn.jar:?]
at jdk.nashorn.internal.runtime.linker.Bootstrap.createDynamicInvoker(Bootstrap.java:345) ~[nashorn.jar:?]
at jdk.nashorn.internal.runtime.linker.InvokeByName.<init>(InvokeByName.java:86) ~[nashorn.jar:?]
at jdk.nashorn.internal.runtime.linker.InvokeByName.<init>(InvokeByName.java:73) ~[nashorn.jar:?]
at jdk.nashorn.internal.objects.Global.<init>(Global.java:96) ~[nashorn.jar:?]
at jdk.nashorn.internal.runtime.Context.newGlobal(Context.java:1111) ~[nashorn.jar:?]
at jdk.nashorn.api.scripting.NashornScriptEngine$2.run(NashornScriptEngine.java:350) ~[nashorn.jar:?]
at jdk.nashorn.api.scripting.NashornScriptEngine$2.run(NashornScriptEngine.java:346) ~[nashorn.jar:?]
at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_131]
at jdk.nashorn.api.scripting.NashornScriptEngine.createNashornGlobal(NashornScriptEngine.java:346) ~[nashorn.jar:?]
at jdk.nashorn.api.scripting.NashornScriptEngine.createGlobalMirror(NashornScriptEngine.java:340) ~[nashorn.jar:?]
at jdk.nashorn.api.scripting.NashornScriptEngine.createBindings(NashornScriptEngine.java:170) ~[nashorn.jar:?]
at org.apache.jmeter.control.IfController$NashornJsEngine.evaluate(IfController.java:123) ~[ApacheJMeter_core.jar:3.2 r1790748]
at org.apache.jmeter.control.IfController.evaluateCondition(IfController.java:185) ~[ApacheJMeter_core.jar:3.2 r1790748]
at org.apache.jmeter.control.IfController.next(IfController.java:239) ~[ApacheJMeter_core.jar:3.2 r1790748]
at org.apache.jmeter.control.GenericController.nextIsAController(GenericController.java:219) ~[ApacheJMeter_core.jar:3.2 r1790748]
at org.apache.jmeter.control.GenericController.next(GenericController.java:173) ~[ApacheJMeter_core.jar:3.2 r1790748]
at org.apache.jmeter.control.LoopController.next(LoopController.java:123) ~[ApacheJMeter_core.jar:3.2 r1790748]
at org.apache.jmeter.control.LoopController.nextIsNull(LoopController.java:151) ~[ApacheJMeter_core.jar:3.2 r1790748]
at org.apache.jmeter.control.GenericController.next(GenericController.java:168) ~[ApacheJMeter_core.jar:3.2 r1790748]
at org.apache.jmeter.control.LoopController.next(LoopController.java:123) ~[ApacheJMeter_core.jar:3.2 r1790748]
at org.apache.jmeter.control.GenericController.nextIsAController(GenericController.java:222) ~[ApacheJMeter_core.jar:3.2 r1790748]
at org.apache.jmeter.control.GenericController.next(GenericController.java:173) ~[ApacheJMeter_core.jar:3.2 r1790748]
at org.apache.jmeter.control.LoopController.next(LoopController.java:123) ~[ApacheJMeter_core.jar:3.2 r1790748]
at org.apache.jmeter.control.LoopController.nextIsNull(LoopController.java:151) ~[ApacheJMeter_core.jar:3.2 r1790748]
at org.apache.jmeter.control.GenericController.next(GenericController.java:168) ~[ApacheJMeter_core.jar:3.2 r1790748]
at org.apache.jmeter.control.LoopController.next(LoopController.java:123) ~[ApacheJMeter_core.jar:3.2 r1790748]
at... etc etc

编辑:现在我放弃这个,只使用香草线程组,因为它没有给出任何错误。

4

3 回答 3

2

Ultimate 插件和 If 控制器存在一个已知问题。您可以在 JSR 223 Element 中检查这一点,并在 If 控制器中仅检查布尔结果。例如,保存vars.putObject("myBoolean", isTrue);并检查${myBoolean}为条件。

编辑

更好的解决方案,您可以检查控制器${even}及其之前是否使用 JSR223 元素,并将 even = true/false 定义为 String

if (ctx.getThreadNum() % 2 == 0) {
    vars.putObject("even", "true");
    log.info("even true");
} else {
    vars.putObject("even", "false");
        log.info("even false");
}
于 2017-10-06T15:12:31.723 回答
2

JMeter 3.1 开始,建议对 JMeter中的任何形式的脚本使用 JSR223 测试元素和 __groovy 函数,因此我建议从 JavaScript 切换到 Groovy 并在 If Controller 的“条件”区域中使用__groovy() 函数,例如:

${__groovy(ctx.getThreadNum() %2 == 0,)}

有关JMeter 测试、基准测试、最佳实践等上下文中的 Groovy 脚本的更多信息,请参阅Apache Groovy - 为什么以及如何使用它一文。

于 2017-10-09T04:05:20.087 回答
1

我通过删除 if 控制器来解决我的问题,以便让所有其他用户/线程进行新的调用。我没有采用这种逻辑,而是只制作了一半的线程,并且它们的数量乘以 2,具有相同的效果。这使得所有类型的线程组都可以工作。

于 2017-11-06T15:09:11.230 回答