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