首页
学习
活动
专区
圈层
工具
发布

JMX定义
EN

Stack Overflow用户
提问于 2009-05-13 17:52:56
回答 6查看 5.9K关注 0票数 31

我正在寻找:

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

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-05-13 19:46:28

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

基本的方法是为想要监视的东西创建一个接口,然后有一个类实现这个接口,然后用"MBeanServer“注册该类的一个实例(这实际上使JMX监控应用程序(如j控制台)可以使用接口中定义的内容)。

这里有一个琐碎的,但是很有用的例子:

(我假设Java 5或更高版本)

TestServerMBean.java

代码语言:javascript
复制
public interface TestServerMBean
{
    public long getUptimeMillis();
    public long getFooCount();
    public void setFooCount(long val);
    public void printStuff(String stuff);
}

TestServer.java:

代码语言:javascript
复制
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。您可以查看当前的“正常运行时间”,并每5秒查看一次FooCounter增量。您还可以将FooCounter设置为任意(长)值,并使用任何字符串参数调用printStuff方法。

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

有许多额外的特性和不同类型的MBeans,但仅仅是上面显示的普通JMX就有很长的路要走。

票数 33
EN

Stack Overflow用户

发布于 2009-05-13 18:54:47

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

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

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

jconsole由Sun提供,它可以轻松地远程查看MBeans,而不必编写自己的客户端解决方案。您还可以使用自定义解决方案来使用MBeans,这可以给您提供极好的灵活性。

另外,已经有一些内置了JMX MBean监控的监控软件。Zenoss和应用程序管理器8可以这样做,举几个例子。

加法:

已经有很多利用JMX的软件了。Tomcat公开了可以通过j控制台访问的信息,JBoss应用服务器也是如此。

票数 13
EN

Stack Overflow用户

发布于 2009-06-02 17:29:57

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

JSR 262为JMX远程API定义了一个连接器,该接口使用Web服务使JMX设备远程可用。客户端不必是Java应用程序,但可以是。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/859414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档