📄 jmeterthread.java
字号:
// checks the scheduler to stop the iteration
stopScheduler();
}
} catch (JMeterStopTestException e) {
log.info("Stopping Test: " + e.toString());
stopTest();
} catch (JMeterStopThreadException e) {
log.info("Stopping Thread: " + e.toString());
stopThread();
} catch (Exception e) {
log.error("", e);
}
}
if (controller.isDone()) {
running = false;
}
}
}
// Might be found by contoller.next()
catch (JMeterStopTestException e) {
log.info("Stopping Test: " + e.toString());
stopTest();
} catch (JMeterStopThreadException e) {
log.info("Stop Thread seen: " + e.toString());
} catch (Exception e) {
log.error("Test failed!", e);
} catch (ThreadDeath e) {
throw e; // Must not ignore this one
} catch (Error e) {// Make sure errors are output to the log file
log.error("Test failed!", e);
} finally {
threadContext.clear();
log.info("Thread " + threadName + " is done");
monitor.threadFinished(this);
threadFinished();
}
}
/**
* Get the SampleListeners for the sampler. Listeners who receive transaction sample
* will not be in this list.
*
* @param samplePack
* @param transactionPack
* @param transactionSampler
* @return the listeners who should receive the sample result
*/
private List getSampleListeners(SamplePackage samplePack, SamplePackage transactionPack, TransactionSampler transactionSampler) {
List sampleListeners = samplePack.getSampleListeners();
// Do not send subsamples to listeners which receive the transaction sample
if(transactionSampler != null) {
ArrayList onlySubSamplerListeners = new ArrayList();
List transListeners = transactionPack.getSampleListeners();
for(Iterator i = sampleListeners.iterator(); i.hasNext();) {
SampleListener listener = (SampleListener)i.next();
// Check if this instance is present in transaction listener list
boolean found = false;
for(Iterator j = transListeners.iterator(); j.hasNext();) {
// Check for the same instance
if(j.next() == listener) {
found = true;
break;
}
}
if(!found) {
onlySubSamplerListeners.add(listener);
}
}
sampleListeners = onlySubSamplerListeners;
}
return sampleListeners;
}
/**
*
*/
protected void initRun() {
threadContext = JMeterContextService.getContext();
threadContext.setVariables(threadVars);
threadContext.setThreadNum(getThreadNum());
threadContext.getVariables().put(LAST_SAMPLE_OK, "true");
threadContext.setThread(this);
threadContext.setThreadGroup(threadGroup);
testTree.traverse(compiler);
// listeners = controller.getListeners();
if (scheduler) {
// set the scheduler to start
startScheduler();
}
rampUpDelay();
log.info("Thread " + Thread.currentThread().getName() + " started");
JMeterContextService.incrNumberOfThreads();
threadGroup.incrNumberOfThreads();
GuiPackage gp =GuiPackage.getInstance();
if (gp != null) {// check there is a GUI
gp.getMainFrame().updateCounts();
}
/*
* Setting SamplingStarted before the contollers are initialised allows
* them to access the running values of functions and variables (however
* it does not seem to help with the listeners)
*/
if (startEarlier)
threadContext.setSamplingStarted(true);
controller.initialize();
controller.addIterationListener(new IterationListener());
if (!startEarlier)
threadContext.setSamplingStarted(true);
threadStarted();
}
/**
*
*/
private void threadStarted() {
ThreadListenerTraverser startup = new ThreadListenerTraverser(true);
testTree.traverse(startup);
}
/**
*
*/
private void threadFinished() {
ThreadListenerTraverser shut = new ThreadListenerTraverser(false);
testTree.traverse(shut);
JMeterContextService.decrNumberOfThreads();
threadGroup.decrNumberOfThreads();
GuiPackage gp = GuiPackage.getInstance();
if (gp != null){
gp.getMainFrame().updateCounts();
}
}
private static class ThreadListenerTraverser implements HashTreeTraverser {
private boolean isStart = false;
private ThreadListenerTraverser(boolean start) {
isStart = start;
}
public void addNode(Object node, HashTree subTree) {
if (node instanceof ThreadListener) {
ThreadListener tl = (ThreadListener) node;
if (isStart) {
tl.threadStarted();
} else {
tl.threadFinished();
}
}
}
public void subtractNode() {
}
public void processPath() {
}
}
public String getThreadName() {
return threadName;
}
public void stop() {
running = false;
log.info("Stopping " + threadName);
}
private void stopTest() {
running = false;
log.info("Stop Test detected by thread " + threadName);
// engine.stopTest();
if (engine != null)
engine.askThreadsToStop();
}
private void stopThread() {
running = false;
log.info("Stop Thread detected by thread " + threadName);
}
private void checkAssertions(List assertions, SampleResult result) {
Iterator iter = assertions.iterator();
while (iter.hasNext()) {
Assertion assertion = (Assertion) iter.next();
TestBeanHelper.prepare((TestElement) assertion);
AssertionResult assertionResult = assertion.getResult(result);
result.setSuccessful(result.isSuccessful() && !(assertionResult.isError() || assertionResult.isFailure()));
result.addAssertionResult(assertionResult);
}
threadContext.getVariables().put(LAST_SAMPLE_OK, Boolean.toString(result.isSuccessful()));
}
private void runPostProcessors(List extractors) {
ListIterator iter;
if (reversePostProcessors) {// Original (rather odd) behaviour
iter = extractors.listIterator(extractors.size());// start at the end
while (iter.hasPrevious()) {
PostProcessor ex = (PostProcessor) iter.previous();
TestBeanHelper.prepare((TestElement) ex);
ex.process();
}
} else {
iter = extractors.listIterator(); // start at the beginning
while (iter.hasNext()) {
PostProcessor ex = (PostProcessor) iter.next();
TestBeanHelper.prepare((TestElement) ex);
ex.process();
}
}
}
private void delay(List timers) {
long sum = 0;
Iterator iter = timers.iterator();
while (iter.hasNext()) {
Timer timer = (Timer) iter.next();
TestBeanHelper.prepare((TestElement) timer);
sum += timer.delay();
}
if (sum > 0) {
try {
Thread.sleep(sum);
} catch (InterruptedException e) {
log.error("", e);
}
}
}
private void notifyTestListeners() {
threadVars.incIteration();
Iterator iter = testListeners.iterator();
while (iter.hasNext()) {
TestListener listener = (TestListener) iter.next();
if (listener instanceof TestElement) {
listener.testIterationStart(new LoopIterationEvent(controller, threadVars.getIteration()));
((TestElement) listener).recoverRunningVersion();
} else {
listener.testIterationStart(new LoopIterationEvent(controller, threadVars.getIteration()));
}
}
}
private void notifyListeners(List listeners, SampleResult result) {
SampleEvent event = new SampleEvent(result, threadGroup.getName());
notifier.notifyListeners(event, listeners);
}
public void setInitialDelay(int delay) {
initialDelay = delay;
}
/**
* Initial delay if ramp-up period is active for this threadGroup.
*/
private void rampUpDelay() {
if (initialDelay > 0) {
try {
Thread.sleep(initialDelay);
} catch (InterruptedException e) {
}
}
}
/**
* Returns the threadNum.
*/
public int getThreadNum() {
return threadNum;
}
/**
* Sets the threadNum.
*
* @param threadNum
* the threadNum to set
*/
public void setThreadNum(int threadNum) {
this.threadNum = threadNum;
}
private class IterationListener implements LoopIterationListener {
/*
* (non-Javadoc)
*
* @see LoopIterationListener#iterationStart(LoopIterationEvent)
*/
public void iterationStart(LoopIterationEvent iterEvent) {
notifyTestListeners();
}
}
/**
* Save the engine instance for access to the stop methods
*
* @param engine
*/
public void setEngine(StandardJMeterEngine engine) {
this.engine = engine;
}
/**
* Should Test stop on sampler error?
*
* @param b -
* true or false
*/
public void setOnErrorStopTest(boolean b) {
onErrorStopTest = b;
}
/**
* Should Thread stop on Sampler error?
*
* @param b -
* true or false
*/
public void setOnErrorStopThread(boolean b) {
onErrorStopThread = b;
}
public ThreadGroup getThreadGroup() {
return threadGroup;
}
public void setThreadGroup(ThreadGroup group) {
this.threadGroup = group;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -