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]

Reply via email to