Java JMX定义

Java JMX定义,java,jakarta-ee,jmx,Java,Jakarta Ee,Jmx,我正在寻找: JMX是什么 在那里我可以找到一些好的JMX 教程 JMX能为我提供什么作为 JavaEE程序员 还有什么我应该知道的吗 的 这是我第一次读JMX时读到的两个 Sun教程: Spring2.5/JMX:简而言之,JMX允许您从运行的JVM内部远程调用方法或查看公开的数据。许多应用程序使用JMX将远程仪表板连接到其运行的JVM,以提供远程管理 例如,如果您有一台运行在机器上的应用服务器,那么使用JMX可以远程查看有关该服务器的公开信息。还可以编写自己的JMX MBean,它可以公开

我正在寻找:

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

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

Sun教程:


Spring2.5/JMX:

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

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

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

jconsole
由Sun和Java提供,可以轻松地远程查看MBean,而无需编写自己的客户端解决方案。您还可以使用定制的解决方案来使用MBean,这可以为您提供极好的灵活性

此外,JMX MBean监控内置了一些监控软件。Zenoss和ApplicationsManager8就是这样做的,举几个例子

添加:


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

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

基本方法是为要监视的对象创建一个接口,然后让一个类实现该接口,然后向“MBeanServer”注册该类的实例(这实际上使接口中定义的内容可供jconsole等JMX监视应用程序使用)

下面是一个简单但有效的示例:

(我假设Java 5或更好)

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

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


有很多附加功能和不同类型的MBean,但我认为上面所示的普通JMX很有帮助。

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

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

JSR262很可能是下一个Java版本(Java7)的一部分

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

或者您也可以在StackOverflow上看到右侧,我几天前更新了它,列出了您要求的内容,以及一些提供的其他信息:


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


我三年前发布了这个问题。。我很确定那没有exist@dubdubdubdot:Tag wiki存在,但其中的内容要么是空的,要么是不同的。在研究这项技术大约4年后,我在几年前的一次会议上介绍了“Java管理扩展(JMX)简介”。此会话的幻灯片可在上找到。Project link now是一个很好的示例,是的,但它不会使任何内容在JConsole中可见
public interface TestServerMBean
{
    public long getUptimeMillis();
    public long getFooCount();
    public void setFooCount(long val);
    public void printStuff(String stuff);
}
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();
    }
}