如何使用JMX连接到localhost jvm上的Java程序?

游客:

我应该使用JMX连接到localhost jvm上的Java程序。换句话说,我想开发一个JMX客户端以在localhost上配置Java程序。

  • 不建议使用JConsole!JConsole不适合使用,因为它是通用JMX客户端,并且对主程序性能有负面影响。

  • 甲骨文站点上的示例使用RMIConnector和host:port参数,但我不知道:应该在哪里设置jmx端口?

  • JConsole可以选择通过PID连接到Java进程。但是我没有在JMX api中找到任何以PID作为输入参数的方法。

灰色:

我们使用类似于以下内容的方式以编程方式连接到我们的JMX服务器。您应该使用以下参数来运行服务器:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.ssl=false

要绑定到特定地址,您需要添加以下VM参数:

-Djava.rmi.server.hostname=A.B.C.D

然后,您可以使用如下所示的JMX客户端代码连接到服务器:

String host = "localhost";  // or some A.B.C.D
int port = 1234;
String url = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi";
JMXServiceURL serviceUrl = new JMXServiceURL(url);
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceUrl, null);
try {
   MBeanServerConnection mbeanConn = jmxConnector.getMBeanServerConnection();
   // now query to get the beans or whatever
   Set<ObjectName> beanSet = mbeanConn.queryNames(null, null);
   ...
} finally {
   jmxConnector.close();
}

我们也有一些代码可以通过编程方式将自身发布到VM参数之外的特定端口,但这比我想的还要有用。


就连接“ by pid”而言,据我所知,您需要使用Java6从Java领域进行操作。我没有使用以下代码,但似乎可以正常工作。

List<VirtualMachineDescriptor> vms = VirtualMachine.list();
for (VirtualMachineDescriptor desc : vms) {
    VirtualMachine vm;
    try {
        vm = VirtualMachine.attach(desc);
    } catch (AttachNotSupportedException e) {
        continue;
    }
    Properties props = vm.getAgentProperties();
    String connectorAddress =
        props.getProperty("com.sun.management.jmxremote.localConnectorAddress");
    if (connectorAddress == null) {
        continue;
    }
    JMXServiceURL url = new JMXServiceURL(connectorAddress);
    JMXConnector connector = JMXConnectorFactory.connect(url);
    try {
        MBeanServerConnection mbeanConn = connector.getMBeanServerConnection();
        Set<ObjectName> beanSet = mbeanConn.queryNames(null, null);
        ...
    } finally {
        jmxConnector.close();
    }
}

我也是SimpleJMX软件包的作者,该软件包使启动JMX服务器和将bean发布到远程客户端变得很容易。

// create a new server listening on port 8000
JmxServer jmxServer = new JmxServer(8000);
// start our server
jmxServer.start();
// register our lookupCache object defined below
jmxServer.register(lookupCache);
jmxServer.register(someOtherObject);
// stop our server
jmxServer.stop();

它也有一个客户端接口,但是现在它没有任何机制可以通过PID查找进程-仅支持主机/端口组合(在6/2012中)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用JMX连接到在EC2上运行的Java实例

使用Java FTP连接到Localhost

在Linux上开始使用JMX身份验证时无法连接到JMX

无法使用DBeaver连接到localhost上的MariaDB

无法使用HeidiSQL连接到Vagrant:“无法连接到'localhost'上的MySQL服务器”

如何将JProfiler连接到在localhost上运行的应用程序?

如何将JMX远程连接到Dataproc上的Spark worker

仍然可以使用Java Mission Control连接到远程JMX,但证书已过期?

如何使用Java连接到Active Directory

如何使用Java连接到mariadb?

如何使用Java连接到mysql?

如何使用Java连接到Rabbitmq集群?

AWS Fargate-从本地无法连接到在AWS Fargate上运行的Java应用程序的jmx端口

如何使用RStudio上的新连接连接到posgresql

Jconsole无法连接到本地jmx应用程序

无法为PocessBuilder程序远程连接到JMX

如何使用Java连接到数据库连接

从Docker容器连接到localhost上的MySQL

无法在端口4430上连接到localhost

在Mac上无法连接到localhost

在Java 9中以编程方式连接到JMX代理

如何修复'无法在'localhost:3306'上连接到MySQL服务器'错误

JMX:无法从Windows盒连接到Linux系统上的JMX端口

使用相同的源端口和目标端口连接到localhost上的服务器

如何解决错误`java.net.ConnectException:无法连接到localhost / 127.0.0.1:8000`

如何使用heroku CLI连接到选定的应用程序

如何使用Dapper连接到ProgressDB数据提供程序?

如何使用 pymsql 连接到 docker 容器上的 mariadb

如何使用Pandas将系列连接到DataFrame上?