[jbosstools-dev] [Fwd: [jbosstools-commits] JBoss Tools SVN: r2207 - in trunk/as/plugins/org.jboss.ide.eclipse.as.core: META-INF and 2 other directories.]

Rob Stryker rob.stryker at redhat.com
Fri Jun 29 13:38:03 EDT 2007


The twiddle launch was a *very* heavy thing. Sure, it'd only run a quick 
JMX client to poll the server, but it'd do this 10 times or more before 
the server was actually started. Each time it did it, it would spawn a 
new process, with all the overhead of a new VM etc, just to do what is 
really a few lines of JMX code.

I removed the hard-coded stuff within an hour of committing it ;)  But 
I'm glad you're being diligent in communicating here.

You're right in that my new Poller doesn't clean up its class loader. 
I'll have to look into that.

Overall I think it was a necessary change. yes it was heavy.

Max Rydahl Andersen wrote:
> Just noticed this one in commits:
>
> No longer launches twiddle as its own process.
>
> and the code is now using classloaders inside the eclipse process to 
> get the launch going.
>
> I know this is tempting to do (I did it myself in hibernate tools) BUT 
> I wan't to remove it again simply because it very easily result in leaks.
>
> e.g. the current code does not use a finally block to clean up its 
> classloader (p.s. it also seem to use hardcoded paths to the jbossas 
> server?!)
>
> Was the twiddle launch really a heavy thing or ?
>
> /max
>
> ------------------------------------------------------------------------
>
> Subject:
> [jbosstools-commits] JBoss Tools SVN: r2207 - in 
> trunk/as/plugins/org.jboss.ide.eclipse.as.core: META-INF and 2 other 
> directories.
> From:
> jbosstools-commits at lists.jboss.org
> Date:
> Thu, 28 Jun 2007 20:19:55 -0400
> To:
> jbosstools-commits at lists.jboss.org
>
> To:
> jbosstools-commits at lists.jboss.org
>
>
> Author: rob.stryker at jboss.com
> Date: 2007-06-28 20:19:55 -0400 (Thu, 28 Jun 2007)
> New Revision: 2207
>
> Added:
>    trunk/as/plugins/org.jboss.ide.eclipse.as.core/getopt.jar
> Modified:
>    trunk/as/plugins/org.jboss.ide.eclipse.as.core/.classpath
>    trunk/as/plugins/org.jboss.ide.eclipse.as.core/META-INF/MANIFEST.MF
>    trunk/as/plugins/org.jboss.ide.eclipse.as.core/build.properties
>    trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/runtime/server/polling/TwiddlePoller.java
>    trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/JBossServerBehavior.java
> Log:
> More efficient polling mechanism added. 
> No longer launches twiddle as its own process.
>
> Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.core/.classpath
> ===================================================================
> --- trunk/as/plugins/org.jboss.ide.eclipse.as.core/.classpath	2007-06-28 17:15:47 UTC (rev 2206)
> +++ trunk/as/plugins/org.jboss.ide.eclipse.as.core/.classpath	2007-06-29 00:19:55 UTC (rev 2207)
> @@ -1,9 +1,11 @@
>  <?xml version="1.0" encoding="UTF-8"?>
>  <classpath>
>  	<classpathentry kind="src" path="jbosscore"/>
> +	<classpathentry exported="true" kind="lib" path="getopt.jar"/>
>  	<classpathentry exported="true" kind="lib" path="dom4j-1.6.1.jar"/>
>  	<classpathentry exported="true" kind="lib" path="jaxen-1.1-beta-6.jar"/>
>  	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
>  	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
> +	<classpathentry kind="lib" path="C:/Training/jboss-4.x/lib/getopt.jar"/>
>  	<classpathentry kind="output" path="bin"/>
>  </classpath>
>
> Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.core/META-INF/MANIFEST.MF
> ===================================================================
> --- trunk/as/plugins/org.jboss.ide.eclipse.as.core/META-INF/MANIFEST.MF	2007-06-28 17:15:47 UTC (rev 2206)
> +++ trunk/as/plugins/org.jboss.ide.eclipse.as.core/META-INF/MANIFEST.MF	2007-06-29 00:19:55 UTC (rev 2207)
> @@ -36,4 +36,5 @@
>   org.jboss.ide.eclipse.as.core.util
>  Bundle-ClassPath: dom4j-1.6.1.jar,
>   jaxen-1.1-beta-6.jar,
> - jbossascore.jar
> + jbossascore.jar,
> + getopt.jar
>
> Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.core/build.properties
> ===================================================================
> --- trunk/as/plugins/org.jboss.ide.eclipse.as.core/build.properties	2007-06-28 17:15:47 UTC (rev 2206)
> +++ trunk/as/plugins/org.jboss.ide.eclipse.as.core/build.properties	2007-06-29 00:19:55 UTC (rev 2207)
> @@ -6,5 +6,6 @@
>                 jaxen-1.1-beta-6.jar,\
>                 dom4j-1.6.1.jar,\
>                 plugin.properties,\
> -               schema/
> +               schema/,\
> +               getopt.jar
>  source.jbossascore.jar = jbosscore/
>
> Added: trunk/as/plugins/org.jboss.ide.eclipse.as.core/getopt.jar
> ===================================================================
> (Binary files differ)
>
>
> Property changes on: trunk/as/plugins/org.jboss.ide.eclipse.as.core/getopt.jar
> ___________________________________________________________________
> Name: svn:mime-type
>    + application/octet-stream
>
> Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/runtime/server/polling/TwiddlePoller.java
> ===================================================================
> --- trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/runtime/server/polling/TwiddlePoller.java	2007-06-28 17:15:47 UTC (rev 2206)
> +++ trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/runtime/server/polling/TwiddlePoller.java	2007-06-29 00:19:55 UTC (rev 2207)
> @@ -21,9 +21,25 @@
>   */
>  package org.jboss.ide.eclipse.as.core.runtime.server.polling;
>  
> +import java.io.IOException;
> +import java.net.MalformedURLException;
> +import java.net.URL;
> +import java.net.URLClassLoader;
>  import java.util.Date;
> +import java.util.Properties;
>  
> -import org.eclipse.debug.core.model.IProcess;
> +import javax.management.AttributeNotFoundException;
> +import javax.management.InstanceNotFoundException;
> +import javax.management.MBeanException;
> +import javax.management.MBeanServerConnection;
> +import javax.management.MalformedObjectNameException;
> +import javax.management.ObjectName;
> +import javax.management.ReflectionException;
> +import javax.naming.InitialContext;
> +import javax.naming.NamingException;
> +
> +import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
> +import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
>  import org.eclipse.wst.server.core.IServer;
>  import org.jboss.ide.eclipse.as.core.model.EventLogModel;
>  import org.jboss.ide.eclipse.as.core.model.ServerProcessModel;
> @@ -32,7 +48,7 @@
>  import org.jboss.ide.eclipse.as.core.runtime.server.IServerStatePoller;
>  import org.jboss.ide.eclipse.as.core.server.JBossServerLaunchConfiguration;
>  import org.jboss.ide.eclipse.as.core.server.TwiddleLauncher;
> -import org.jboss.ide.eclipse.as.core.server.TwiddleLauncher.ProcessData;
> +import org.jboss.ide.eclipse.as.core.util.ArgsUtil;
>  import org.jboss.ide.eclipse.as.core.util.SimpleTreeItem;
>  
>  public class TwiddlePoller implements IServerStatePoller {
> @@ -66,44 +82,61 @@
>  	private class PollerRunnable implements Runnable {
>  		private TwiddleLauncher launcher;
>  		public void run() {
> -			String args = "get \"jboss.system:type=Server\" Started";
> -			while( !canceled && !done ) {
> -				// are start processes still going?
> -				ServerProcessModelEntity ent = ServerProcessModel.getDefault().getModel(server.getId());
> -				IProcess[] processes = ent.getProcesses(JBossServerLaunchConfiguration.START);
> -				if( ServerProcessModel.allProcessesTerminated(processes)) {
> -					done = true;
> -					started = 0;
> -					eventAllProcessesTerminated();
> -				} else {
> -					launcher = new TwiddleLauncher();
> -					ProcessData[] datas = launcher.getTwiddleResults(server, args, true);
> -					if( datas.length == 1 ) {
> -						ProcessData d = datas[0];
> -						String out = d.getOut();
> -						if( out.startsWith("Started=true")) {
> -							started = STATE_STARTED;
> -						} else if(out.startsWith("Started=false")) {
> -							started = STATE_TRANSITION; // it's alive and responding
> -						} else if( out.indexOf("java.lang.SecurityException") != -1 ) {
> -							// throw exception 
> -							securityException = true;
> -						} else {
> -							started = STATE_STOPPED; // It's fully down
> -						}
> -						
> -						if( started == 1 && expectedState == SERVER_UP ) {
> +			ClassLoader currentLoader = Thread.currentThread().getContextClassLoader();
> +			ClassLoader twiddleLoader = getClassLoader();
> +			if( twiddleLoader != null ) {
> +				Thread.currentThread().setContextClassLoader(twiddleLoader);
> +				System.out.println("here we go");
> +				
> +				Properties props = new Properties();
> +		        props.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
> +		        props.put("java.naming.provider.url","jnp://localhost:1099");
> +		        props.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
> +		        
> +		        while( !done && !canceled ) {
> +					InitialContext ic;
> +					try {
> +						ic = new InitialContext(props);
> +			            Object obj = ic.lookup("jmx/invoker/RMIAdaptor");
> +			            ic.close();
> +			            System.out.println(obj);
> +			            if( obj instanceof MBeanServerConnection ) {
> +			                    MBeanServerConnection connection = (MBeanServerConnection)obj;
> +			                    Object attInfo = connection.getAttribute(new ObjectName("jboss.system:type=Server"), "Started");
> +			                    boolean b = ((Boolean)attInfo).booleanValue();
> +			                    started = b ? STATE_STARTED : STATE_TRANSITION;
> +			                    if( b && expectedState )
> +			                    	done = true;
> +			            }
> +					} catch (NamingException e) {
> +						// should give up now
> +					} catch( SecurityException se ) {
> +						securityException = true;
> +					} catch( Exception e ) {
> +						System.out.println("exception: " + e.getMessage());
> +						e.printStackTrace();
> +						started = STATE_STOPPED;
> +						if( !expectedState )
>  							done = true;
> -						} else if( started == 0 && expectedState == SERVER_DOWN) {
> -							done = true;
> -						} 
>  					}
> -				}
> -				if( !canceled )
> -					eventTwiddleExecuted();
> +
> +		        } // end while
>  			}
> +			
> +			Thread.currentThread().setContextClassLoader(currentLoader);
> +
>  		}
> -
> +		protected ClassLoader getClassLoader() {
> +			try {
> +				URL url = new URL("file:///C:/apps/jboss/4.2.ga.src/build/output/jboss-4.2.0.GA/client/jbossall-client.jar");
> +				URL url2 = new URL("file:///C:/apps/jboss/4.2.ga.src/build/output/jboss-4.2.0.GA/bin/twiddle.jar");
> +				URLClassLoader loader = new URLClassLoader(new URL[] {url, url2}, Thread.currentThread().getContextClassLoader());
> +				return loader;
> +			} catch( MalformedURLException murle) {
> +				murle.printStackTrace();
> +			}
> +			return null;
> +		}
>  		public void setCanceled() {
>  			if( launcher != null ) {
>  				launcher.setCanceled();
>
> Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/JBossServerBehavior.java
> ===================================================================
> --- trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/JBossServerBehavior.java	2007-06-28 17:15:47 UTC (rev 2206)
> +++ trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/JBossServerBehavior.java	2007-06-29 00:19:55 UTC (rev 2207)
> @@ -45,6 +45,7 @@
>  	
>  	
>  	private PollThread pollThread = null;
> +	
>  	public JBossServerBehavior() {
>  		super();
>  	}
> @@ -87,14 +88,18 @@
>  	}
>  	
>  	protected void forceStop() {
> +		forceStop(true);
> +	}
> +	protected void forceStop(boolean addEvent) {
>  		// just terminate the processes. All of them
>  		try {
>  			ServerProcessModel.getDefault().getModel(getServer().getId()).clearAll();
>  			process = null;
>  			setServerStopped();
> -			EventLogTreeItem tpe = new ForceShutdownEvent();
> -			EventLogModel.markChanged(tpe.getEventRoot());
> -
> +			if( addEvent ) {
> +				EventLogTreeItem tpe = new ForceShutdownEvent();
> +				EventLogModel.markChanged(tpe.getEventRoot());
> +			}
>  		} catch( Throwable t ) {
>  			t.printStackTrace();
>  		}
> @@ -131,7 +136,7 @@
>  					for (int i = 0; i < size; i++) {
>  						if (process != null && process.equals(events[i].getSource()) && events[i].getKind() == DebugEvent.TERMINATE) {
>  							DebugPlugin.getDefault().removeDebugEventListener(this);
> -							forceStop();
> +							forceStop(false);
>  						}
>  					}
>  				}
>
> _______________________________________________
> jbosstools-commits mailing list
> jbosstools-commits at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/jbosstools-commits
>   
> ------------------------------------------------------------------------
>
> _______________________________________________
> jbosstools-dev mailing list
> jbosstools-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/jbosstools-dev



More information about the jbosstools-dev mailing list