java - 如何以编程方式调用目标进程的 MBeans 操作
问题描述
我想通过以下方式模拟jconsole
:
识别暴露 jmx 功能的正在运行的进程(例如
pid: 14796 FreshProject.jar
:)列出可用的 MBean 库(例如
org.jacoco
:)调用操作(例如:单击
dump
)
我试过使用这里simplejmx
提到的库,但我对应该使用什么感到困惑。我尝试通过,当我读到这些是默认值但它错误。hostName
port
localhost
1099
java.net.ConnectException: Connection refused: connect
请不要将我指向另一个软帖子并关闭它,因为我很可能已经阅读并尝试了几次。
解决方案
我想模拟 jconsole 的作用
看看 jconsole 的实现 - 见http://openjdk.java.net/tools/svc/jconsole/和https://github.com/openjdk/jdk/tree/master/src/jdk.jconsole/share /类
我对应该使用什么主机名和端口感到困惑。我尝试传递 localhost 和 1099,因为我读过这些是默认值,但它错误 java.net.ConnectException: Connection denied: connect.
根据https://docs.oracle.com/en/java/javase/11/management/monitoring-and-management-using-jmx-technology.html默认情况下没有端口。JConsole 使用Attach API - 请参阅https://github.com/openjdk/jdk/blob/master/src/jdk.jconsole/share/classes/sun/tools/jconsole/LocalVirtualMachine.java在此代码中,您还会发现回答
识别公开 jmx 功能的正在运行的进程
要通过端口连接,您需要指定适当的参数。例如以下Example.java
class Example {
public static void main(String[] args) {
while (true) {
}
}
}
可以开始为
java \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
Example
然后
列出可用的 MBean
可以做为
import javax.management.MBeanServer;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.lang.management.ManagementFactory;
import java.util.Iterator;
import java.util.Set;
class GetMBeans {
public static void main(final String[] args) throws Exception {
final JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");
final JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
final MBeanServerConnection connection = jmxc.getMBeanServerConnection();
Set<ObjectInstance> instances = connection.queryMBeans(null, null);
Iterator<ObjectInstance> iterator = instances.iterator();
while (iterator.hasNext()) {
ObjectInstance instance = iterator.next();
System.out.println(instance.getClassName() + " " + instance.getObjectName());
}
}
}
在上述开始后Example
也与 JaCoCo
java \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-javaagent:jacoco-0.8.4/lib/jacocoagent.jar=jmx=true \
Example
执行javac GetMBeans.java && java GetMBeans | grep jacoco
产品
org.jacoco.agent.rt.internal_035b120.Agent org.jacoco:type=Runtime
调用操作
MBeanClient.java
显示在JaCoCo 文档中 - 参见https://www.jacoco.org/jacoco/trunk/doc/api.html
import javax.management.MBeanServer;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.lang.management.ManagementFactory;
import java.util.Iterator;
import java.util.Set;
class MBeanClient {
public static void main(final String[] args) throws Exception {
final JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");
final JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
final MBeanServerConnection connection = jmxc.getMBeanServerConnection();
final IProxy proxy = (IProxy) MBeanServerInvocationHandler.newProxyInstance(connection, new ObjectName("org.jacoco:type=Runtime"), IProxy.class, false);
final byte[] data = proxy.getExecutionData(false);
System.out.println("Got " + data.length + " bytes");
}
public interface IProxy {
String getVersion();
String getSessionId();
void setSessionId(String id);
byte[] getExecutionData(boolean reset);
void dump(boolean reset);
void reset();
}
}
执行javac MBeanClient.java && java MBeanClient
产品
Got 84 bytes
推荐阅读
- c++ - 在c ++中,以相反顺序排序的最快方法是什么?
- rust - 将整数转换为浮点数时如何添加正确的类型注释?
- php - 无法调用 php artisan
- spring - Spring-boot应用程序部署问题
- unit-testing - 在 Rust 中比较函数是否相等
- amazon-web-services - 为什么我的 CodeDeploy 到 lambda 不起作用?
- web-scraping - 如果亚马逊不通过 API 提供这些信息,Jungle Scout 和 ASINspector 等服务如何提供亚马逊评论/评级数据?
- jhipster - JHIPSTER OKTA invalid_id_token
- reactjs - 如何测试从状态读取的反应组件
- java - 如何限制 EditText 输入只允许 3 位整数或小数