Skip to content

Commit 03749fa

Browse files
Fix parallel controller iteration count synchronization (#96)
- Add ParentIterationVariables wrapper to delegate iteration count to parent thread - Inject custom variables into parallel threads to maintain iteration consistency - Add Maven Shade plugin to bundle dependencies and resolve GUI loading issues
1 parent 19fa282 commit 03749fa

File tree

2 files changed

+62
-1
lines changed

2 files changed

+62
-1
lines changed

parallel/pom.xml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,37 @@
3939

4040
<build>
4141
<plugins>
42+
<plugin>
43+
<groupId>org.apache.maven.plugins</groupId>
44+
<artifactId>maven-shade-plugin</artifactId>
45+
<version>3.2.4</version>
46+
<executions>
47+
<execution>
48+
<phase>package</phase>
49+
<goals>
50+
<goal>shade</goal>
51+
</goals>
52+
<configuration>
53+
<createDependencyReducedPom>false</createDependencyReducedPom>
54+
<filters>
55+
<filter>
56+
<artifact>*:*</artifact>
57+
<excludes>
58+
<exclude>META-INF/*.SF</exclude>
59+
<exclude>META-INF/*.DSA</exclude>
60+
<exclude>META-INF/*.RSA</exclude>
61+
</excludes>
62+
</filter>
63+
</filters>
64+
<transformers>
65+
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
66+
<mainClass>com.blazemeter.jmeter.controller.ParallelSampler</mainClass>
67+
</transformer>
68+
</transformers>
69+
</configuration>
70+
</execution>
71+
</executions>
72+
</plugin>
4273
<plugin>
4374
<groupId>org.sonatype.plugins</groupId>
4475
<artifactId>nexus-staging-maven-plugin</artifactId>

parallel/src/main/java/com/blazemeter/jmeter/controller/ParallelSampler.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,13 +247,43 @@ private void injectVariables(JMeterThread jmThread, JMeterContext threadContext)
247247
Class<JMeterThread> cls = JMeterThread.class;
248248
Field vars = cls.getDeclaredField("threadVars");
249249
vars.setAccessible(true);
250-
vars.set(jmThread, threadContext.getVariables());
250+
251+
JMeterVariables parentVars = threadContext.getVariables();
252+
JMeterVariables customVars = new ParentIterationVariables(parentVars, threadContext.getThread());
253+
vars.set(jmThread, customVars);
251254
} catch (Throwable ex) {
252255
log.warn("Cannot inject variables into parallel thread ", ex);
253256
}
254257
}
255258
}
256259

260+
/**
261+
* Custom JMeterVariables implementation that delegates to parent thread's variables
262+
* but returns the parent thread's iteration count instead of this thread's iteration count.
263+
*/
264+
private static class ParentIterationVariables extends JMeterVariables {
265+
private final JMeterVariables parentVars;
266+
267+
public ParentIterationVariables(JMeterVariables parentVars, JMeterThread parentThread) {
268+
this.parentVars = parentVars;
269+
}
270+
271+
@Override
272+
public int getIteration() {
273+
return parentVars.getIteration();
274+
}
275+
276+
@Override
277+
public String get(String key) {
278+
return parentVars.get(key);
279+
}
280+
281+
@Override
282+
public void put(String key, String value) {
283+
parentVars.put(key, value);
284+
}
285+
}
286+
257287
private void changeVariablesMap() {
258288
try {
259289
JMeterContext context = this.getThreadContext();

0 commit comments

Comments
 (0)