【问题标题】:If controller in jMeter thread group如果 jMeter 线程组中的控制器
【发布时间】:2017-10-06 14:12:50
【问题描述】:

我正在使用 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

编辑:现在我放弃这个,只使用普通线程组,因为它不会给出任何错误。

【问题讨论】:

    标签: java jmeter stack-overflow jmeter-plugins jmeter-3.2


    【解决方案1】:

    因为 JMeter 3.1 it is recommended to use JSR223 Test Elements and __groovy function 用于 JMeter 中的任何形式的脚本,所以我建议从 JavaScript 切换到 Groovy 并在 If Controller 的“条件”区域中使用 __groovy() function,例如:

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

    请参阅Apache Groovy - Why and How You Should Use It 文章,了解有关在 JMeter 测试、基准测试、最佳实践等方面的 Groovy 脚本的更多信息。

    【讨论】:

    • 啊,非常感谢您的回复!我会试试这个。
    • 这给出了与以前相同的结果。肯定有其他问题。
    【解决方案2】:

    有一个已知的issue 带有 Ultimate 插件和 If 控制器。您可以在 JSR 223 元素中检查这个并在 If 控制器中只检查布尔结果。例如,保存 vars.putObject("myBoolean", isTrue); 并检查 ${myBoolean} 作为条件。

    编辑

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

    if (ctx.getThreadNum() % 2 == 0) {
        vars.putObject("even", "true");
        log.info("even true");
    } else {
        vars.putObject("even", "false");
            log.info("even false");
    }
    

    【讨论】:

    • 啊,我明白了。感谢您的回复!
    • 这也给出了与以前相同的结果。肯定有其他问题。
    • 当然。这只是导致问题的线程组,所有服务器和 IP 地址都已删除,因此无法正常工作。 expirebox.com/download/682e753f241cb4bf12df3e7e6253abd3.html
    • 嗯,这就是我上传的文件中的内容。我已经使用 bools 和 strings 进行了测试,但两者都不起作用。编辑: if-controller 工作,但他们不解决我原来的问题。
    • 您的 JSR223 元素已被禁用且代码不同
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多