Timers and "BZM Parallel Controller" in JMeter

69 views
Skip to first unread message

Richard Hill

unread,
Jun 16, 2025, 10:50:57 AMJun 16
to jmeter-plugins

I'm trying to use timers to with the "BZM Parallel Controller" in JMeter but not having much luck:

  1. If I put the timer as a child of a http sampler, the Timers are ignored.

  2. If I put the timer at the same level of a http sampler, the Timers are ignored.

  3. If I put the timer at the same level and before the BZM Parallel Controller, the timer value (e.g. 10 seconds) is added to the response duration of the BZM Parallel Controller.

  4. If I use JSR223 PostProcessor as a child of the http sampler with a Thread.sleep(10000) , this appears to work but when I use the "validate thread group" option to test and debug a single threaded test, it won't ignore threadsleeps so takes an age to run.

  5. If I use a "Flow Control Action" at the same level and before the BZM Parallel Controller, but as above, this appears to work when I use the "validate thread group" option to test and debug a single threaded test, it won't ignore "Flow Control Actions" so takes an age to run.

Any help or guidance would be appreciated. Thanks

I'm use JMeter 5.6.2 + "BZM Parallel Controller" 0.12 with "Generate Parent Sample" checked.

Dmitri T

unread,
Jun 17, 2025, 10:46:01 AMJun 17
to jmeter-plugins

I cannot reproduce points 1 and 2, the timers are working as expected:

enter image description here

For Flow Control Action sampler you can set the think time in User Defined Variables so if you need to dry-run the test without think time you will have to change it only in one place.

Richard Hill

unread,
Jun 17, 2025, 11:20:18 AMJun 17
to jmeter-plugins
Thanks Dmitri T for the reply.... but different timers do different things:

As a CHILD of Sampler
  1. Constant Timer @ 10000ms - Timers are Ignored. 
  2. JSR223 Timer @10000ms - This adds the thinktime to the  "bzm - Parallel Controller" load time time. Not desirable.
  3. JSR223 PostProcessor with threadsleep @10000ms - Works Fine.
Same can be seen  when directly underneath sampler but the scope is wider (i.e. applied to all in "bzm - Parallel Controller")



Richard Hill

unread,
Jun 23, 2025, 4:00:18 AMJun 23
to jmeter-plugins
Just wondering if you have any more thoughts on this?

I am trying to capture the "BZM Parallel Controller" duration.

    1. Constant Timer @ 10000ms - Timers are Ignored. 
    2. JSR223 Timer @10000ms - This adds the thinktime to the  "bzm - Parallel Controller" load time time. Not desirable.
    1. JSR223 PostProcessor with threadsleep @10000ms - Works Fine, correct duration in "bzm - Parallel Controller" load time time
    2. Flow Control Action  with thread pause @10000ms - Works Fine in "bzm - Parallel Controller" load time time

    Both 3 and 4 work but is a pain for when trying to "validate a threadgroup" (i.e run as a single thread) as it won't skip the delays. Having to manage it via UDV's.

    It would appear that there are two issues with timers when using within "bzm - Parallel Controller". Timers are ignored OR if using a "JSR233 timer", it's duration is added to the "bzm - Parallel Controller" duration.

    I appreciate any input. 
    Thanks
    Rich.

    Richard Hill

    unread,
    Jun 24, 2025, 7:17:47 AMJun 24
    to jmeter-plugins
    Enable/Disable "bzm - Parallel Controller (TestA)" - "bzm - Parallel Controller (TestB)" to see the difference in behaviour.
    Neither work as expected and as mentioned. Flow control action or JSR223 PostProcessor do work.
     

    StackOverflow & Plugins Google Group2.jmx

    <?xml version="1.0" encoding="UTF-8"?>
    <jmeterTestPlan version="1.2" properties="5.0" jmeter="5.6.2">
      <hashTree>
        <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
          <boolProp name="TestPlan.functional_mode">false</boolProp>
          <boolProp name="TestPlan.tearDown_on_shutdown">false</boolProp>
          <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
          <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
            <collectionProp name="Arguments.arguments"/>
          </elementProp>
        </TestPlan>
        <hashTree>
          <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="StackOverflow &amp; Plugins Google Group2" enabled="true">
            <boolProp name="ThreadGroup.delayedStart">true</boolProp>
            <stringProp name="ThreadGroup.num_threads">1</stringProp>
            <stringProp name="ThreadGroup.ramp_time">1</stringProp>
            <stringProp name="ThreadGroup.duration">30</stringProp>
            <boolProp name="ThreadGroup.same_user_on_next_iteration">false</boolProp>
            <boolProp name="ThreadGroup.scheduler">true</boolProp>
            <stringProp name="ThreadGroup.on_sample_error">startnextloop</stringProp>
            <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" enabled="true">
              <intProp name="LoopController.loops">-1</intProp>
              <boolProp name="LoopController.continue_forever">false</boolProp>
            </elementProp>
            <stringProp name="ThreadGroup.delay"></stringProp>
          </ThreadGroup>
          <hashTree>
            <DNSCacheManager guiclass="DNSCachePanel" testclass="DNSCacheManager" testname="DNS Cache Manager" enabled="true">
              <collectionProp name="DNSCacheManager.servers"/>
              <boolProp name="DNSCacheManager.clearEachIteration">true</boolProp>
              <boolProp name="DNSCacheManager.isCustomResolver">false</boolProp>
            </DNSCacheManager>
            <hashTree/>
            <ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults" enabled="true">
              <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
                <collectionProp name="Arguments.arguments"/>
              </elementProp>
              <boolProp name="HTTPSampler.image_parser">true</boolProp>
              <boolProp name="HTTPSampler.concurrentDwn">true</boolProp>
              <stringProp name="HTTPSampler.concurrentPool">6</stringProp>
            </ConfigTestElement>
            <hashTree/>
            <ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults - ViaProxy" enabled="false">
              <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
                <collectionProp name="Arguments.arguments"/>
              </elementProp>
              <boolProp name="HTTPSampler.image_parser">true</boolProp>
              <boolProp name="HTTPSampler.concurrentDwn">true</boolProp>
              <stringProp name="HTTPSampler.concurrentPool">6</stringProp>
              <stringProp name="HTTPSampler.proxyHost">localhost</stringProp>
              <stringProp name="HTTPSampler.proxyPort">8888</stringProp>
            </ConfigTestElement>
            <hashTree/>
            <CacheManager guiclass="CacheManagerGui" testclass="CacheManager" testname="HTTP Cache Manager" enabled="false">
              <boolProp name="clearEachIteration">true</boolProp>
              <boolProp name="useExpires">true</boolProp>
              <boolProp name="CacheManager.controlledByThread">false</boolProp>
            </CacheManager>
            <hashTree/>
            <CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager " enabled="true">
              <collectionProp name="CookieManager.cookies"/>
              <boolProp name="CookieManager.clearEachIteration">true</boolProp>
              <boolProp name="CookieManager.controlledByThreadGroup">false</boolProp>
            </CookieManager>
            <hashTree/>
            <com.blazemeter.jmeter.controller.ParallelSampler guiclass="com.blazemeter.jmeter.controller.ParallelControllerGui" testclass="com.blazemeter.jmeter.controller.ParallelSampler" testname="bzm - Parallel Controller (TestA: Timer is Ignored. Test runs fast)" enabled="true">
              <intProp name="MAX_THREAD_NUMBER">6</intProp>
              <boolProp name="PARENT_SAMPLE">true</boolProp>
              <boolProp name="LIMIT_MAX_THREAD_NUMBER">false</boolProp>
            </com.blazemeter.jmeter.controller.ParallelSampler>
            <hashTree>
              <kg.apc.jmeter.samplers.DummySampler guiclass="kg.apc.jmeter.samplers.DummySamplerGui" testclass="kg.apc.jmeter.samplers.DummySampler" testname="jp@gc - Dummy Sampler1" enabled="true">
                <boolProp name="WAITING">true</boolProp>
                <boolProp name="SUCCESFULL">true</boolProp>
                <stringProp name="RESPONSE_CODE">200</stringProp>
                <stringProp name="RESPONSE_MESSAGE">OK</stringProp>
                <stringProp name="REQUEST_DATA">Dummy Sampler used to simulate requests and responses
    without actual network activity. This helps debugging tests.</stringProp>
                <stringProp name="RESPONSE_DATA">Dummy Sampler used to simulate requests and responses
    without actual network activity. This helps debugging tests.</stringProp>
                <stringProp name="RESPONSE_TIME">${__Random(50,500)}</stringProp>
                <stringProp name="LATENCY">${__Random(1,50)}</stringProp>
                <stringProp name="CONNECT">${__Random(1,5)}</stringProp>
                <stringProp name="URL"></stringProp>
                <stringProp name="RESULT_CLASS">org.apache.jmeter.samplers.SampleResult</stringProp>
              </kg.apc.jmeter.samplers.DummySampler>
              <hashTree>
                <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Think Time - Fixed (Timer is Ignored. Test Runs Fast)" enabled="true">
                  <stringProp name="ConstantTimer.delay">10000</stringProp>
                </ConstantTimer>
                <hashTree/>
              </hashTree>
              <kg.apc.jmeter.samplers.DummySampler guiclass="kg.apc.jmeter.samplers.DummySamplerGui" testclass="kg.apc.jmeter.samplers.DummySampler" testname="jp@gc - Dummy Sampler2" enabled="true">
                <boolProp name="WAITING">true</boolProp>
                <boolProp name="SUCCESFULL">true</boolProp>
                <stringProp name="RESPONSE_CODE">200</stringProp>
                <stringProp name="RESPONSE_MESSAGE">OK</stringProp>
                <stringProp name="REQUEST_DATA">Dummy Sampler used to simulate requests and responses
    without actual network activity. This helps debugging tests.</stringProp>
                <stringProp name="RESPONSE_DATA">Dummy Sampler used to simulate requests and responses
    without actual network activity. This helps debugging tests.</stringProp>
                <stringProp name="RESPONSE_TIME">${__Random(50,500)}</stringProp>
                <stringProp name="LATENCY">${__Random(1,50)}</stringProp>
                <stringProp name="CONNECT">${__Random(1,5)}</stringProp>
                <stringProp name="URL"></stringProp>
                <stringProp name="RESULT_CLASS">org.apache.jmeter.samplers.SampleResult</stringProp>
              </kg.apc.jmeter.samplers.DummySampler>
              <hashTree/>
            </hashTree>
            <com.blazemeter.jmeter.controller.ParallelSampler guiclass="com.blazemeter.jmeter.controller.ParallelControllerGui" testclass="com.blazemeter.jmeter.controller.ParallelSampler" testname="bzm - Parallel Controller (TestB: Timer isnt Ignored but duration added to &quot;bzm - Parallel Controller&quot; Load Time)" enabled="false">
              <intProp name="MAX_THREAD_NUMBER">6</intProp>
              <boolProp name="PARENT_SAMPLE">true</boolProp>
              <boolProp name="LIMIT_MAX_THREAD_NUMBER">false</boolProp>
            </com.blazemeter.jmeter.controller.ParallelSampler>
            <hashTree>
              <kg.apc.jmeter.samplers.DummySampler guiclass="kg.apc.jmeter.samplers.DummySamplerGui" testclass="kg.apc.jmeter.samplers.DummySampler" testname="jp@gc - Dummy Sampler1" enabled="true">
                <boolProp name="WAITING">true</boolProp>
                <boolProp name="SUCCESFULL">true</boolProp>
                <stringProp name="RESPONSE_CODE">200</stringProp>
                <stringProp name="RESPONSE_MESSAGE">OK</stringProp>
                <stringProp name="REQUEST_DATA">Dummy Sampler used to simulate requests and responses
    without actual network activity. This helps debugging tests.</stringProp>
                <stringProp name="RESPONSE_DATA">Dummy Sampler used to simulate requests and responses
    without actual network activity. This helps debugging tests.</stringProp>
                <stringProp name="RESPONSE_TIME">${__Random(50,500)}</stringProp>
                <stringProp name="LATENCY">${__Random(1,50)}</stringProp>
                <stringProp name="CONNECT">${__Random(1,5)}</stringProp>
                <stringProp name="URL"></stringProp>
                <stringProp name="RESULT_CLASS">org.apache.jmeter.samplers.SampleResult</stringProp>
              </kg.apc.jmeter.samplers.DummySampler>
              <hashTree>
                <JSR223Timer guiclass="TestBeanGUI" testclass="JSR223Timer" testname="JSR223 Timer (Timer isnt Ignored but duration added to &quot;bzm - Parallel Controller&quot; Load Time)" enabled="true">
                  <stringProp name="cacheKey">true</stringProp>
                  <stringProp name="filename"></stringProp>
                  <stringProp name="parameters"></stringProp>
                  <stringProp name="script">log.info(&apos;running timer&apos;)
    return 10000</stringProp>
                  <stringProp name="scriptLanguage">groovy</stringProp>
                </JSR223Timer>
                <hashTree/>
              </hashTree>
              <kg.apc.jmeter.samplers.DummySampler guiclass="kg.apc.jmeter.samplers.DummySamplerGui" testclass="kg.apc.jmeter.samplers.DummySampler" testname="jp@gc - Dummy Sampler2" enabled="true">
                <boolProp name="WAITING">true</boolProp>
                <boolProp name="SUCCESFULL">true</boolProp>
                <stringProp name="RESPONSE_CODE">200</stringProp>
                <stringProp name="RESPONSE_MESSAGE">OK</stringProp>
                <stringProp name="REQUEST_DATA">Dummy Sampler used to simulate requests and responses
    without actual network activity. This helps debugging tests.</stringProp>
                <stringProp name="RESPONSE_DATA">Dummy Sampler used to simulate requests and responses
    without actual network activity. This helps debugging tests.</stringProp>
                <stringProp name="RESPONSE_TIME">${__Random(50,500)}</stringProp>
                <stringProp name="LATENCY">${__Random(1,50)}</stringProp>
                <stringProp name="CONNECT">${__Random(1,5)}</stringProp>
                <stringProp name="URL"></stringProp>
                <stringProp name="RESULT_CLASS">org.apache.jmeter.samplers.SampleResult</stringProp>
              </kg.apc.jmeter.samplers.DummySampler>
              <hashTree/>
            </hashTree>
          </hashTree>
          <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
            <boolProp name="ResultCollector.error_logging">false</boolProp>
            <objProp>
              <name>saveConfig</name>
              <value class="SampleSaveConfiguration">
                <time>true</time>
                <latency>true</latency>
                <timestamp>true</timestamp>
                <success>true</success>
                <label>true</label>
                <code>true</code>
                <message>true</message>
                <threadName>true</threadName>
                <dataType>true</dataType>
                <encoding>false</encoding>
                <assertions>true</assertions>
                <subresults>true</subresults>
                <responseData>false</responseData>
                <samplerData>false</samplerData>
                <xml>false</xml>
                <fieldNames>true</fieldNames>
                <responseHeaders>false</responseHeaders>
                <requestHeaders>false</requestHeaders>
                <responseDataOnError>false</responseDataOnError>
                <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
                <assertionsResultsToSave>0</assertionsResultsToSave>
                <bytes>true</bytes>
                <sentBytes>true</sentBytes>
                <url>true</url>
                <threadCounts>true</threadCounts>
                <idleTime>true</idleTime>
                <connectTime>true</connectTime>
              </value>
            </objProp>
            <stringProp name="filename"></stringProp>
          </ResultCollector>
          <hashTree/>
          <ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="Summary Report" enabled="true">
            <boolProp name="ResultCollector.error_logging">false</boolProp>
            <objProp>
              <name>saveConfig</name>
              <value class="SampleSaveConfiguration">
                <time>true</time>
                <latency>true</latency>
                <timestamp>true</timestamp>
                <success>true</success>
                <label>true</label>
                <code>true</code>
                <message>true</message>
                <threadName>true</threadName>
                <dataType>true</dataType>
                <encoding>false</encoding>
                <assertions>true</assertions>
                <subresults>true</subresults>
                <responseData>false</responseData>
                <samplerData>false</samplerData>
                <xml>false</xml>
                <fieldNames>true</fieldNames>
                <responseHeaders>false</responseHeaders>
                <requestHeaders>false</requestHeaders>
                <responseDataOnError>false</responseDataOnError>
                <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
                <assertionsResultsToSave>0</assertionsResultsToSave>
                <bytes>true</bytes>
                <sentBytes>true</sentBytes>
                <url>true</url>
                <threadCounts>true</threadCounts>
                <idleTime>true</idleTime>
                <connectTime>true</connectTime>
              </value>
            </objProp>
            <stringProp name="filename"></stringProp>
          </ResultCollector>
          <hashTree/>
        </hashTree>
      </hashTree>
    </jmeterTestPlan>

    Dmitri T

    unread,
    Jun 24, 2025, 9:40:07 AMJun 24
    to jmeter-plugins
    As I've mentioned I cannot reproduce your issue, maybe you should re-install JMeter from scratch, install Plugins Manager, install Parallel Controller using the Plugins Manager and retry? Screen Recording 2025-06-24 at 15.36.32.gif

    Richard Hill

    unread,
    Jun 24, 2025, 10:24:59 AMJun 24
    to jmeter-plugins
    Thanks.... I've just tried on 5.6.3 and it appears to correctly apply the timer so it's either a problem with 5.6.2 or my configuration of 5.6.2

    However, the bigger issue is that it's adding the timer value to the "BZM bzm - Parallel Controller" load time.
    Screenshot 2025-06-24 152402.png

    Richard Hill

    unread,
    Jun 24, 2025, 11:14:21 AMJun 24
    to jmeter-plugins
    Confirmed 100% that timers (constant timer) being ignored is a 5.6.2 issue only. Checked fresh downloads & install on a VM and compared to 5.6.2 to 5.6.3

    However, as mentioned and illustrated in the previous screenshot, its adding the timer duration to "bzm - Parallel Controller" load time. This is a problem for both the "Constant Timer" and "JSR233 Timer" in both  5.6.2 & 5.6.3 .
    Thanks
    Reply all
    Reply to author
    Forward
    0 new messages