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(a)lists.jboss.org
> Date:
> Thu, 28 Jun 2007 20:19:55 -0400
> To:
> jbosstools-commits(a)lists.jboss.org
>
> To:
> jbosstools-commits(a)lists.jboss.org
>
>
> Author: rob.stryker(a)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(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/jbosstools-commits
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> jbosstools-dev mailing list
> jbosstools-dev(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/jbosstools-dev