JMX定义

31

我需要:

  • 什么是 JMX。
  • 在哪里可以找到一些好的 JMX 教程。
  • JMX 对作为 Java EE 程序员的我能提供什么。
  • 我应该知道的其他任何内容。
6个回答

34

JMX是一种查看和操作应用程序运行状态的方式。如果有类似SNMP的概念,它与之有些相似。我认为,对于除了写入日志文件之外没有其他用户界面的服务器型应用程序来说,它是必不可少的监控和理解工具。

基本的方法是创建一个要监视的接口,然后让一个类实现该接口,最后将该类的实例注册到"MBeanServer"中(这实际上可以使在接口中定义的内容可供像jconsole这样的JMX监控应用程序使用)。

下面是一个微不足道但却有效的示例:

(假设使用Java 5或更高版本)

TestServerMBean.java

public interface TestServerMBean
{
    public long getUptimeMillis();
    public long getFooCount();
    public void setFooCount(long val);
    public void printStuff(String stuff);
}

TestServer.java:

import java.lang.management.ManagementFactory;
import java.util.concurrent.atomic.AtomicLong;

import javax.management.ObjectName;

// If jconsole doesn't see this app automatically, invoke the application with the following java flags, and connect
// 'remotely' via jconsole.
//
// -Dcom.sun.management.jmxremote
// -Dcom.sun.management.jmxremote.port=2222 (or whatever)
// -Dcom.sun.management.jmxremote.authenticate=false
// -Dcom.sun.management.jmxremote.ssl=false
public class TestServer implements TestServerMBean
{
    private final AtomicLong m_counter = new AtomicLong(0L);
    private final long m_startTimeMillis = System.currentTimeMillis();

    public void run() throws InterruptedException {
        while (true) {
            m_counter.incrementAndGet();
            Thread.sleep(5000);
        }
    }

    public long getFooCount() {
        return m_counter.get();
    }

    public void setFooCount(long val) {
        m_counter.set(val);
    }

    public long getUptimeMillis() {
        return System.currentTimeMillis() - m_startTimeMillis;
    }

    public void printStuff(String stuff) {
        System.out.println(stuff);
    }

    public static void main(String[] args) throws Exception {
        TestServer ts = new TestServer();
        ManagementFactory.getPlatformMBeanServer().registerMBean(ts, new ObjectName("myapp:service=MyServer"));
        ts.run();
    }
}

编译和运行TestServer.class,像往常一样,启动jconsole,连接到TestServer(如果没有自动显示,请参见上面的代码注释),然后查看"MBeans"选项卡,您将看到我们的实例名为myapp:service=MyServer。您可以查看当前的“正常运行时间”,并观察FooCounter每5秒钟增加一次。您还可以将FooCounter设置为任何(长)值,并使用任何字符串参数调用printStuff方法。

显然,这是一个荒谬的“服务器”,但希望有一个简单的工作示例将有助于说明整体概念:能够窥视和操作正在运行的应用程序。

虽然有许多其他功能和不同类型的MBeans,但仅使用上述基本JMX功能就足以满足大多数需求。


不错的例子,但它在JConsole中没有显示任何内容。 - apostrophedottilde

13
简而言之,JMX允许您从正在运行的JVM内部远程调用方法或查看公开的数据。许多应用程序使用JMX来附加远程仪表板以提供远程管理。
例如,如果您在机器上运行一个应用服务器,并且使用JMX,则可以远程查看有关该服务器的公开信息。还可以编写自己的JMX MBean,这些MBean可以公开应用程序中的任何变量或方法。然后可以通过远程"轮询"公开的变量以测试您想要了解的某些条件。
JMX的另一个有用之处是可以在运行时远程更改变量。例如,如果您设置了某种池,其具有最大总量,则可以在不必重新启动或更改应用程序服务器上的任何配置文件的情况下远程更改此最大数量。
Sun提供jconsole与Java一起,可以轻松地远程查看您的MBeans,而无需编写自己的客户端解决方案。您也可以使用自定义解决方案消耗MBeans,这可以给您极大的灵活性。
此外,已经有一些监视软件具有内置的JMX MBean监视功能。 Zenoss和Applications Manager 8就是其中的几个例子。
补充说明:已经有很多软件利用了JMX。 Tomcat公开了可以通过jconsole访问的信息,JBoss应用服务器也是如此。

1

或许在这里提到JSR 262也是值得的。

"JSR 262定义了一个连接器,用于JMX远程API,它使用Web服务使JMX仪表可远程使用。客户端不必是Java应用程序,但可以是其他的."

很有可能JSR 262将成为下一个Java版本(Java 7)的一部分。

有一个java.net项目JMX WS连接器,它依赖于WiseMan项目。WiseMan是WS-Management标准的开源Java实现。


项目链接现在是http://ws-jmx-connector.java.net/。 - Julio


0

0

我在3年前发布了这个问题... 我非常确定那时候不存在这个。 - mainstringargs
@dubdubdubdot:标签维基已经存在,但里面的内容要么为空,要么不同。 - haylem
我在这项技术上工作了约4年时间,几年前我在https://www.youtube.com/watch?v=F-f2zYeWwwo上介绍了“Java管理扩展(JMX)入门”会议。此会议的幻灯片可在http://www.slideshare.net/tarun.telang/java-management-extensions-jmx上获取。 - Tarun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接