Author: sebb
Date: Thu Feb 3 23:54:13 2011
New Revision: 1067038
URL: http://svn.apache.org/viewvc?rev=1067038&view=rev
Log:
Bug 50659 - JMeter server does not support concurrent tests - prevent client
from starting another
(part deux)
Remove thread from ClientJMeterEngine - if it is required for GUI, then let the
GUI create the thread
This allows proper return of error conditions
Also replace System.exit() with interrupt() of RMI thread
Modified:
jakarta/jmeter/trunk/src/core/org/apache/jmeter/JMeter.java
jakarta/jmeter/trunk/src/core/org/apache/jmeter/engine/ClientJMeterEngine.java
Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/JMeter.java
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/JMeter.java?rev=1067038&r1=1067037&r2=1067038&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/JMeter.java (original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/JMeter.java Thu Feb 3
23:54:13 2011
@@ -331,7 +331,13 @@ public class JMeter implements JMeterPlu
System.out.println(JMeterUtils.getResourceFileAsText("org/apache/jmeter/help.txt"));//
$NON-NLS-1$
} else if (parser.getArgumentById(SERVER_OPT) != null) {
// Start the server
- startServer(JMeterUtils.getPropDefault("server_port", 0));//
$NON-NLS-1$
+ try {
+
RemoteJMeterEngineImpl.startServer(JMeterUtils.getPropDefault("server_port",
0)); // $NON-NLS-1$
+ } catch (Exception ex) {
+ System.err.println("Server failed to start: "+ex);
+ log.error("Giving up, as server failed with:", ex);
+ throw ex;
+ }
startOptionalServers();
} else {
String testFile=null;
@@ -666,16 +672,6 @@ public class JMeter implements JMeterPlu
return jmlogfile;
}
- private void startServer(int port) {
- try {
- RemoteJMeterEngineImpl.startServer(port);
- } catch (Exception ex) {
- log.error("Giving up, as server failed with:", ex);
- System.err.println("Server failed to start: "+ex);
- System.exit(1);// Give up
- }
- }
-
private void startNonGui(String testFile, String logFile, CLOption
remoteStart)
throws IllegalUserActionException {
// add a system property so samplers can check to see if JMeter
@@ -935,12 +931,7 @@ public class JMeter implements JMeterPlu
*/
public void run() {
long now = System.currentTimeMillis();
- println("Tidying up ... @ "+new Date(now)+" ("+now+")");
- /*
- * Note: although it should not be necessary to call System.exit
here, in the case
- * of a remote test, a Timer thread seems to be generated by the
Naming.lookup()
- * method, and it does not die.
- */
+ println("Tidying up remote @ "+new Date(now)+" ("+now+")");
if (engines!=null){ // it will be null unless remoteStop = true
println("Exitting remote servers");
Iterator<JMeterEngine> it = engines.iterator();
@@ -953,6 +944,7 @@ public class JMeter implements JMeterPlu
Thread.sleep(5000); // Allow listeners to close files
} catch (InterruptedException ignored) {
}
+ ClientJMeterEngine.tidyRMI(log);
println("... end of run");
}
Modified:
jakarta/jmeter/trunk/src/core/org/apache/jmeter/engine/ClientJMeterEngine.java
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/engine/ClientJMeterEngine.java?rev=1067038&r1=1067037&r2=1067038&view=diff
==============================================================================
---
jakarta/jmeter/trunk/src/core/org/apache/jmeter/engine/ClientJMeterEngine.java
(original)
+++
jakarta/jmeter/trunk/src/core/org/apache/jmeter/engine/ClientJMeterEngine.java
Thu Feb 3 23:54:13 2011
@@ -24,13 +24,13 @@ import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;
-import java.rmi.ServerException;
import java.rmi.server.RemoteObject;
import java.util.Properties;
import org.apache.jmeter.services.FileServer;
import org.apache.jmeter.testelement.TestListener;
import org.apache.jmeter.threads.JMeterContextService;
+import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.collections.HashTree;
import org.apache.jorphan.collections.SearchByClass;
import org.apache.jorphan.logging.LoggingManager;
@@ -39,7 +39,7 @@ import org.apache.log.Logger;
/**
* Class to run remote tests from the client JMeter and collect remote samples
*/
-public class ClientJMeterEngine implements JMeterEngine, Runnable {
+public class ClientJMeterEngine implements JMeterEngine {
private static final Logger log = LoggingManager.getLoggerForClass();
private static final Object LOCK = new Object();
@@ -78,13 +78,6 @@ public class ClientJMeterEngine implemen
}
/** {@inheritDoc} */
- public void runTest() {
- log.info("about to run remote test on "+host);
- new Thread(this).start();
- log.info("done initiating run command");
- }
-
- /** {@inheritDoc} */
public void stopTest() {
log.info("about to stop remote test on "+host);
try {
@@ -100,16 +93,16 @@ public class ClientJMeterEngine implemen
try {
remote.reset();
} catch (java.rmi.ConnectException e) {
+ log.info("Retry reset after: "+e);
remote = getEngine(host);
remote.reset();
}
} catch (Exception ex) {
- log.error("", ex); // $NON-NLS-1$
+ log.error("Failed to reset remote engine", ex); // $NON-NLS-1$
}
}
- /** {@inheritDoc} */
- public void run() {
+ public void runTest() throws JMeterEngineException {
log.info("running clientengine run method");
SearchByClass<TestListener> testListeners = new
SearchByClass<TestListener>(TestListener.class);
ConvertListeners sampleListeners = new ConvertListeners();
@@ -134,7 +127,7 @@ public class ClientJMeterEngine implemen
{
remote.configure(testTree, host, baseDirRelative);
}
- log.info("sent test to " + host + "
basedir='"+baseDirRelative+"'");
+ log.info("sent test to " + host + "
basedir='"+baseDirRelative+"'"); // $NON-NLS-1$
if (savep != null){
log.info("Sending properties "+savep);
try {
@@ -145,13 +138,30 @@ public class ClientJMeterEngine implemen
}
remote.runTest();
log.info("sent run command to "+ host);
- } catch (ServerException ex) {
- log.error("Error in run() method", ex); // $NON-NLS-1$
- log.fatalError("Exitting JVM"); // Necessary otherwise hangs on
Timer Thread.
- System.out.println("Fatal error, exitting:
"+ex.getLocalizedMessage());
- System.exit(1);
+ } catch (IllegalStateException ex) {
+ log.error("Error in run() method "+ex); // $NON-NLS-1$
+ tidyRMI(log);
+ throw ex; // Don't wrap this error - display it as is
} catch (Exception ex) {
- log.error("Error in run() method", ex); // $NON-NLS-1$
+ log.error("Error in run() method "+ex); // $NON-NLS-1$
+ tidyRMI(log);
+ throw new JMeterEngineException("Error in run() method "+ex, ex);
// $NON-NLS-1$
+ }
+ }
+
+ /**
+ * Tidy up RMI access to allow JMeter client to exit.
+ * Currently just interrups the "RMI Reaper" thread.
+ * @param logger where to log the information
+ */
+ public static void tidyRMI(Logger logger) {
+ for(Thread t : Thread.getAllStackTraces().keySet()){
+ String reaperRE = JMeterUtils.getPropDefault("rmi.thread.name",
"^RMI Reaper$");
+ String name = t.getName();
+ if (name.matches(reaperRE)) {
+ logger.info("Interrupting "+name);
+ t.interrupt();
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]