Pie*_*nri 1 java service jmx process
这背后的动机是使用JMX管理本地java服务,而不像java服务Wrapper那样更重量级.
启动每个服务,-Dcom.sun.management.jmxremote这意味着"JVM配置为作为本地(仅限同一台计算机)的JMX服务器." (见这里有一个很好的解释).
我尝试了Attach API,但决定反对它,因为它没有与Java SE6捆绑在一起,并且无法将其与maven集成.
我正在发布问题以分享解决方案,因为我在这里没有看到它(问答).这里的关键是ConnectorAddressLink.importFrom(pid)用来获取地址.
public static MBeanServerConnection getLocalMBeanServerConnectionStatic(int pid) {
try {
String address = ConnectorAddressLink.importFrom(pid);
JMXServiceURL jmxUrl = new JMXServiceURL(address);
return JMXConnectorFactory.connect(jmxUrl).getMBeanServerConnection();
} catch (IOException e) {
throw new RuntimeException("Of course you still have to implement a good connection handling");
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
@蒂姆·布特
如果ConnectorAddressLink.importFrom返回 null,请尝试将 management-agent.jar 加载到 VM 中。
例如startManagementAgent来自https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/test/sun/management/jmxremote/bootstrap/TestManager.java 的类似函数
private static void startManagementAgent(String pid) throws IOException {
/*
* JAR file normally in ${java.home}/jre/lib but may be in ${java.home}/lib
* with development/non-images builds
*/
String home = System.getProperty("java.home");
String agent = home + File.separator + "jre" + File.separator + "lib"
+ File.separator + "management-agent.jar";
File f = new File(agent);
if (!f.exists()) {
agent = home + File.separator + "lib" + File.separator +
"management-agent.jar";
f = new File(agent);
if (!f.exists()) {
throw new RuntimeException("management-agent.jar missing");
}
}
agent = f.getCanonicalPath();
System.out.println("Loading " + agent + " into target VM ...");
try {
VirtualMachine.attach(pid).loadAgent(agent);
} catch (Exception x) {
throw new IOException(x.getMessage());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5281 次 |
| 最近记录: |