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

时间:2016-07-08 13:30:44

标签: java spring jconsole wildfly-10 spring-jmx

我有一个Spring启动项目,我使用spring-boot-starter-actuator和io.dropwizard.metrics。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-core</artifactId>
    </dependency>

它会生成我可以使用网址http://myapplication/metrics访问的指标。 我在Wildfly 10独立服务器上部署该应用程序。

我想使用jmx来读取jconsole上的指标。 我将应用程序配置为使用JMXReporter发送指标:

@Configuration
@EnableMetrics
public class MetricsConfiguration extends MetricsConfigurerAdapter {
    @Override
    public void configureReporters(MetricRegistry metricRegistry) {
        registerReporter(JmxReporter.forRegistry(metricRegistry)
                .build())
                .start();
    }
}

当我启动服务器并部署应用程序时,日志会说:

  

o.s.b.a.e.j.EndpointMBeanExporter位于托管bean   'metricsEndpoint':将JMX服务器注册为MBean   [门户-WS-JMX:类型=端点,名称= metricsEndpoint]

Server logs

当我运行jconsole时,在Local Process列表中,只有JConsole进程和一些灰色PID。如果我选择灰色PID,则会显示“此进程未启用管理代理”。

我还尝试使用远程进程连接:

  • 服务:JMX:HTTP的远程处理-JMX://本地主机:9990
  • 服务:JMX:远程+ http://localhost:9990
  • 本地主机:9990

JConsole

但这不起作用。

我尝试设置jvm变量:

  • -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only = false

和财产:

  • spring.jmx.enabled =真

它也不起作用。

我可以用jconsole读取jmx指标吗?

2 个答案:

答案 0 :(得分:1)

我在这里找到了一个解决方案: https://github.com/jberlana/JBWhatsAppActivity

我的问题来自Wildfly。 当我运行jconsole时,我需要jboss-cli-client.jar和tools.jar到jconsole类路径:

$JAVA_HOME/bin/jconsole -J-Djava.class.path=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/jconsole.jar:/opt/wildfly-8.2.0.Final/bin/client/jboss-cli-client.jar

现在它有效,我可以使用&#34; service:jmx:remote + https://dzone.com/articles/remote-jmx-access-wildfly-or&#34;连接到jmx。

答案 1 :(得分:0)

这是我用来生成一个工作的spring-boot应用程序的命令行参数的集合(虽然使用Tomcat,而不是Wildfly),它通过JConsole公开事物:

cmd="$cmd -Dcom.sun.management.jmxremote"
cmd="$cmd -Dcom.sun.management.jmxremote.port=9899"
cmd="$cmd -Dcom.sun.management.jmxremote.rmi.port=9811"
cmd="$cmd -Dcom.sun.management.jmxremote.authenticate=false"
cmd="$cmd -Dcom.sun.management.jmxremote.ssl=false"
cmd="${cmd} -Djava.rmi.server.hostname=<IP_OF_YOUR_SERVER>"

请注意,应用程序运行并通过端口9800(在我的情况下)访问。但是,端口9811和9899也可用于处理JMX(如上所述)。您还需要确保可以通过您可能已设置的任何防火墙访问这3个端口。

祝你好运