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: {}", |
514 |
currentThreads, this, |
515 |
new RuntimeException("Thread mismatch")); |
516 |
} |
505 |
Iterator<Map.Entry<String, JMeterProperty>> iter = propMap.entrySet().iterator(); |
517 |
Iterator<Map.Entry<String, JMeterProperty>> iter = propMap.entrySet().iterator(); |
506 |
while (iter.hasNext()) { |
518 |
while (iter.hasNext()) { |
507 |
Map.Entry<String, JMeterProperty> entry = iter.next(); |
519 |
Map.Entry<String, JMeterProperty> entry = iter.next(); |
Lines 514-521
public abstract class AbstractTestElement implements TestElement, Serializable,
Link Here
|
514 |
} |
526 |
} |
515 |
} |
527 |
} |
516 |
emptyTemporary(); |
528 |
emptyTemporary(); |
|
|
529 |
try { |
530 |
Thread.sleep(500); |
531 |
} catch (InterruptedException e) { |
532 |
// nothing to do |
533 |
} |
534 |
currentThreads.remove(currentThread); |
517 |
} |
535 |
} |
518 |
|
536 |
|
|
|
537 |
private static class ComparableThread extends Thread implements Comparable { |
538 |
final Thread t; |
539 |
ComparableThread(Thread t) { |
540 |
this.t = t; |
541 |
} |
542 |
|
543 |
@Override |
544 |
public int hashCode() { |
545 |
return t.hashCode(); |
546 |
} |
547 |
|
548 |
@Override |
549 |
public int compareTo(@NotNull Object o) { |
550 |
return this.t.getName().compareTo(((ComparableThread) o).t.getName()) ; |
551 |
} |
552 |
|
553 |
@Override |
554 |
public boolean equals(Object o) { |
555 |
return o instanceof ComparableThread && compareTo((ComparableThread) o) == 0; |
556 |
} |
557 |
} |
519 |
/** |
558 |
/** |
520 |
* Clears temporaryProperties |
559 |
* Clears temporaryProperties |
521 |
*/ |
560 |
*/ |