mirror of https://github.com/apache/activemq.git
fix for https://issues.apache.org/activemq/browse/AMQ-2275 - activemq-admin attaching to local process
git-svn-id: https://svn.apache.org/repos/asf/activemq/trunk@810588 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
a0426cbd5c
commit
04d27a7d2d
|
@ -16,17 +16,25 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.activemq.console.command;
|
package org.apache.activemq.console.command;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.management.ManagementFactory;
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.HashMap;
|
import java.util.Set;
|
||||||
import java.lang.management.ManagementFactory;
|
|
||||||
|
|
||||||
|
import javax.management.MBeanServerConnection;
|
||||||
import javax.management.remote.JMXConnector;
|
import javax.management.remote.JMXConnector;
|
||||||
import javax.management.remote.JMXConnectorFactory;
|
import javax.management.remote.JMXConnectorFactory;
|
||||||
import javax.management.remote.JMXServiceURL;
|
import javax.management.remote.JMXServiceURL;
|
||||||
import javax.management.MBeanServerConnection;
|
|
||||||
|
import sun.management.ConnectorAddressLink;
|
||||||
|
|
||||||
public abstract class AbstractJmxCommand extends AbstractCommand {
|
public abstract class AbstractJmxCommand extends AbstractCommand {
|
||||||
public static final String DEFAULT_JMX_URL = "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi";
|
public static final String DEFAULT_JMX_URL = "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi";
|
||||||
|
@ -46,6 +54,14 @@ public abstract class AbstractJmxCommand extends AbstractCommand {
|
||||||
return jmxServiceUrl;
|
return jmxServiceUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String getJVM() {
|
||||||
|
return System.getProperty("java.vm.specification.vendor");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isSunJVM() {
|
||||||
|
return getJVM().equals("Sun Microsystems Inc.");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the current JMX service url being used, or create a default one if no JMX service url has been specified.
|
* Get the current JMX service url being used, or create a default one if no JMX service url has been specified.
|
||||||
* @return JMX service url
|
* @return JMX service url
|
||||||
|
@ -53,7 +69,59 @@ public abstract class AbstractJmxCommand extends AbstractCommand {
|
||||||
*/
|
*/
|
||||||
protected JMXServiceURL useJmxServiceUrl() throws MalformedURLException {
|
protected JMXServiceURL useJmxServiceUrl() throws MalformedURLException {
|
||||||
if (getJmxServiceUrl() == null) {
|
if (getJmxServiceUrl() == null) {
|
||||||
setJmxServiceUrl(DEFAULT_JMX_URL);
|
String jmxUrl = DEFAULT_JMX_URL;
|
||||||
|
int connectingPid = -1;
|
||||||
|
if (isSunJVM()) {
|
||||||
|
try {
|
||||||
|
// Try to attach to the local process
|
||||||
|
// Classes are all dynamically loaded, since they are specific to Sun VM
|
||||||
|
// if it fails for any reason default jmx url will be used
|
||||||
|
|
||||||
|
|
||||||
|
// tools.jar are not always included used by default
|
||||||
|
// class loader, so we will try to use custom loader that will
|
||||||
|
// try to load tools.jar
|
||||||
|
String javaHome = System.getProperty("java.home");
|
||||||
|
String tools = javaHome + File.separator +
|
||||||
|
".." + File.separator + "lib" + File.separator + "tools.jar";
|
||||||
|
URLClassLoader loader = new URLClassLoader(new URL[]{new File(tools).toURI().toURL()});
|
||||||
|
|
||||||
|
// load all classes dynamically so we can compile on non-Sun VMs
|
||||||
|
|
||||||
|
//MonitoredHost host = MonitoredHost.getMonitoredHost(new HostIdentifier((String)null));
|
||||||
|
Class monitoredHostClass = Class.forName("sun.jvmstat.monitor.MonitoredHost", true, loader);
|
||||||
|
Method getMonitoredHostMethod = monitoredHostClass.getMethod("getMonitoredHost", String.class);
|
||||||
|
Object host = getMonitoredHostMethod.invoke(null, (String)null);
|
||||||
|
//Set vms = host.activeVms();
|
||||||
|
Method activeVmsMethod = host.getClass().getMethod("activeVms", null);
|
||||||
|
Set vms = (Set)activeVmsMethod.invoke(host, null);
|
||||||
|
for (Object vmid: vms) {
|
||||||
|
int pid = ((Integer) vmid).intValue();
|
||||||
|
//MonitoredVm mvm = host.getMonitoredVm(new VmIdentifier(vmid.toString()));
|
||||||
|
Class vmIdentifierClass = Class.forName("sun.jvmstat.monitor.VmIdentifier", true, loader);
|
||||||
|
Constructor vmIdentifierConstructor = vmIdentifierClass.getConstructor(String.class);
|
||||||
|
Object vmIdentifier = vmIdentifierConstructor.newInstance(vmid.toString());
|
||||||
|
Method getMonitoredVmMethod = host.getClass().getMethod("getMonitoredVm", vmIdentifierClass);
|
||||||
|
Object mvm = getMonitoredVmMethod.invoke(host, vmIdentifier);
|
||||||
|
//String name = MonitoredVmUtil.commandLine(mvm);
|
||||||
|
Class monitoredVmUtilClass = Class.forName("sun.jvmstat.monitor.MonitoredVmUtil", true, loader);
|
||||||
|
Method commandLineMethod = monitoredVmUtilClass.getMethod("commandLine", Class.forName("sun.jvmstat.monitor.MonitoredVm", true, loader));
|
||||||
|
String name = (String)commandLineMethod.invoke(null, mvm);
|
||||||
|
if (name.contains("run.jar start")) {
|
||||||
|
connectingPid = pid;
|
||||||
|
jmxUrl = ConnectorAddressLink.importFrom(pid);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception ignore) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (connectingPid != -1) {
|
||||||
|
context.print("Connecting to pid: " + connectingPid);
|
||||||
|
} else {
|
||||||
|
context.print("Connecting to JMX URL: " + jmxUrl);
|
||||||
|
}
|
||||||
|
setJmxServiceUrl(jmxUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
return getJmxServiceUrl();
|
return getJmxServiceUrl();
|
||||||
|
|
|
@ -131,8 +131,8 @@ if [ -z "$ACTIVEMQ_OPTS" ] ; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -z "$SUNJMX" ] ; then
|
if [ -z "$SUNJMX" ] ; then
|
||||||
SUNJMX="-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
|
#SUNJMX="-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
|
||||||
#SUNJMX="-Dcom.sun.management.jmxremote"
|
SUNJMX="-Dcom.sun.management.jmxremote"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ACTIVEMQ_OPTS="$ACTIVEMQ_OPTS $SUNJMX $SSL_OPTS"
|
ACTIVEMQ_OPTS="$ACTIVEMQ_OPTS $SUNJMX $SSL_OPTS"
|
||||||
|
|
|
@ -73,8 +73,8 @@ if "%ACTIVEMQ_BASE%" == "" set ACTIVEMQ_BASE=%ACTIVEMQ_HOME%
|
||||||
|
|
||||||
if "%ACTIVEMQ_OPTS%" == "" set ACTIVEMQ_OPTS=-Xmx512M -Dorg.apache.activemq.UseDedicatedTaskRunner=true
|
if "%ACTIVEMQ_OPTS%" == "" set ACTIVEMQ_OPTS=-Xmx512M -Dorg.apache.activemq.UseDedicatedTaskRunner=true
|
||||||
|
|
||||||
if "%SUNJMX%" == "" set SUNJMX=-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
|
if "%SUNJMX%" == "" set SUNJMX=-Dcom.sun.management.jmxremote
|
||||||
REM SUNJMX=-Dcom.sun.management.jmxremote
|
REM set SUNJMX=-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
|
||||||
|
|
||||||
REM Uncomment to enable YourKit profiling
|
REM Uncomment to enable YourKit profiling
|
||||||
REM SET ACTIVEMQ_DEBUG_OPTS="-agentlib:yjpagent"
|
REM SET ACTIVEMQ_DEBUG_OPTS="-agentlib:yjpagent"
|
||||||
|
|
Loading…
Reference in New Issue