Lines 25-31
import java.util.LinkedHashMap;
Link Here
|
25 |
import java.util.LinkedHashSet; |
25 |
import java.util.LinkedHashSet; |
26 |
import java.util.List; |
26 |
import java.util.List; |
27 |
import java.util.Map; |
27 |
import java.util.Map; |
|
|
28 |
import java.util.Objects; |
28 |
import java.util.Set; |
29 |
import java.util.Set; |
|
|
30 |
import java.util.concurrent.ConcurrentSkipListSet; |
29 |
|
31 |
|
30 |
import org.apache.jmeter.gui.Searchable; |
32 |
import org.apache.jmeter.gui.Searchable; |
31 |
import org.apache.jmeter.testelement.property.BooleanProperty; |
33 |
import org.apache.jmeter.testelement.property.BooleanProperty; |
Lines 42-47
import org.apache.jmeter.testelement.property.StringProperty;
Link Here
|
42 |
import org.apache.jmeter.testelement.property.TestElementProperty; |
44 |
import org.apache.jmeter.testelement.property.TestElementProperty; |
43 |
import org.apache.jmeter.threads.JMeterContext; |
45 |
import org.apache.jmeter.threads.JMeterContext; |
44 |
import org.apache.jmeter.threads.JMeterContextService; |
46 |
import org.apache.jmeter.threads.JMeterContextService; |
|
|
47 |
import org.jetbrains.annotations.NotNull; |
45 |
import org.slf4j.Logger; |
48 |
import org.slf4j.Logger; |
46 |
import org.slf4j.LoggerFactory; |
49 |
import org.slf4j.LoggerFactory; |
47 |
|
50 |
|
Lines 67-72
public abstract class AbstractTestElement implements TestElement, Serializable,
Link Here
|
67 |
|
70 |
|
68 |
private transient String threadName = null; |
71 |
private transient String threadName = null; |
69 |
|
72 |
|
|
|
73 |
private transient ConcurrentSkipListSet<ComparableThread> currentThreads = new ConcurrentSkipListSet<>(); |
74 |
|
70 |
@Override |
75 |
@Override |
71 |
public Object clone() { |
76 |
public Object clone() { |
72 |
try { |
77 |
try { |
Lines 502-507
public abstract class AbstractTestElement implements TestElement, Serializable,
Link Here
|
502 |
*/ |
507 |
*/ |
503 |
@Override |
508 |
@Override |
504 |
public void recoverRunningVersion() { |
509 |
public void recoverRunningVersion() { |
|
|
510 |
ComparableThread currentThread = new ComparableThread(Thread.currentThread()); |
511 |
currentThreads.add(currentThread); |
512 |
if (currentThreads.size() > 1) { |
513 |
log.warn("Recover in different threads: {}; Element: {}, temporary.size(): {}", |
514 |
currentThreads, |
515 |
this, |
516 |
temporaryProperties == null ? -1 : temporaryProperties.size(), |
517 |
new RuntimeException("Thread mismatch")); |
518 |
} |
505 |
Iterator<Map.Entry<String, JMeterProperty>> iter = propMap.entrySet().iterator(); |
519 |
Iterator<Map.Entry<String, JMeterProperty>> iter = propMap.entrySet().iterator(); |
506 |
while (iter.hasNext()) { |
520 |
while (iter.hasNext()) { |
507 |
Map.Entry<String, JMeterProperty> entry = iter.next(); |
521 |
Map.Entry<String, JMeterProperty> entry = iter.next(); |
Lines 514-521
public abstract class AbstractTestElement implements TestElement, Serializable,
Link Here
|
514 |
} |
528 |
} |
515 |
} |
529 |
} |
516 |
emptyTemporary(); |
530 |
emptyTemporary(); |
|
|
531 |
try { |
532 |
Thread.sleep(500); |
533 |
} catch (InterruptedException e) { |
534 |
// nothing to do |
535 |
} |
536 |
currentThreads.remove(currentThread); |
517 |
} |
537 |
} |
518 |
|
538 |
|
|
|
539 |
private static class ComparableThread extends Thread implements Comparable { |
540 |
final Thread t; |
541 |
ComparableThread(Thread t) { |
542 |
this.t = t; |
543 |
} |
544 |
|
545 |
@Override |
546 |
public int hashCode() { |
547 |
return t.hashCode(); |
548 |
} |
549 |
|
550 |
@Override |
551 |
public int compareTo(@NotNull Object o) { |
552 |
return this.t.getName().compareTo(((ComparableThread) o).t.getName()) ; |
553 |
} |
554 |
|
555 |
@Override |
556 |
public boolean equals(Object o) { |
557 |
return o instanceof ComparableThread && compareTo((ComparableThread) o) == 0; |
558 |
} |
559 |
} |
519 |
/** |
560 |
/** |
520 |
* Clears temporaryProperties |
561 |
* Clears temporaryProperties |
521 |
*/ |
562 |
*/ |