30

我在寻找:

  • JMX 是什么。
  • 我可以在哪里找到一些好的 JMX 教程。
  • 作为一名 Java EE 程序员,JMX 可以为我提供什么。
  • 还有什么我应该知道的。
4

6 回答 6

32

JMX 是一种查看和操作应用程序运行时状态的方法。如果有帮助的话,它在概念上与 SNMP 有点相似。IMO,它对于监视和理解除了写入日志文件之外可能没有任何其他用户界面的服务器类型应用程序是必不可少的。

基本方法是为您要监控的事物创建一个接口,然后让一个类实现该接口,然后使用“MBeanServer”注册该类的一个实例(这实际上使接口中定义的东西可用于 JMX 监控jconsole 等应用程序)。

这是一个微不足道但有效的示例:

(我假设 Java 5 或更好)

测试服务器MBean.java

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

测试服务器.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使用任何 String 参数调用该方法。

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

有很多额外的特性和不同类型的 MBean,但只是上面显示的 vanilla JMX 有很长的路要走,IMO。

于 2009-05-13T19:46:28.697 回答
12

简而言之,JMX 允许您从正在运行的 JVM 内部远程调用方法或查看公开的数据。许多应用程序使用 JMX 将远程仪表板附加到它们正在运行的 JVM 上,以提供远程管理。

例如,如果您在机器上运行了一个应用服务器,那么使用 JMX 就可以远程查看有关该服务器的公开信息。也可以编写您自己的 JMX MBean,它可以在您的应用程序中公开任何变量或方法。然后可以远程“轮询”暴露的变量以测试您想了解的某些条件。

JMX 的另一个有用之处是您可以即时远程更改变量。例如,如果您设置了某种具有最大总量的池,则可以远程更改此最大数量,而无需重新启动或更改应用程序服务器上的任何配置文件。

jconsole由 Sun 与 Java 一起提供,以便能够轻松地远程查看您的 MBean,而无需编写您自己的客户端解决方案。您还可以使用可以为您提供出色灵活性的自定义解决方案来使用 MBean。

此外,已经有一些内置 JMX MBean 监控的监控软件。Zenoss 和 Applications Manager 8 做到了这一点,仅举几例。

添加:

已经有很多软件利用了 JMX。Tomcat 公开可通过 jconsole 访问的信息,JBoss Application Server 也是如此。

于 2009-05-13T18:54:47.377 回答
1

也许 JSR 262 在这里也值得一提。

“JSR 262 为 JMX Remote API 定义了一个连接器,它使用 Web 服务使 JMX 工具远程可用。客户端不必是 Java 应用程序,但可以是。”

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

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

于 2009-06-02T17:29:57.613 回答
1

以下是一些不错的网络资源:

于 2012-11-09T19:32:36.967 回答
0

这是我第一次阅读 JMX 时读到的两个。

太阳教程:http: //java.sun.com/docs/books/tutorial/jmx/index.html

Spring 2.5/JMX:http ://static.springframework.org/spring/docs/2.5.x/reference/jmx.html

于 2009-05-13T18:00:39.507 回答
0

或者您可以在 StackOverflow 上查看JMX 标签 wiki,我几天前对其进行了更新,列出了您所要求的内容,并提供了一些附加信息:

https://stackoverflow.com/tags/jmx/info

于 2012-04-25T09:51:05.870 回答