JMX定义

我在寻找:

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

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

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

这是一个微不足道的 – 但工作 – 例子:

(我假设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 。 您可以查看当前的“正常运行时间”,并每隔5秒观看FooCounter增量。 您还可以将FooCounter设置为您想要的任何(长)值,并使用任何String参数调用printStuff方法。

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

有许多额外的function和不同类型的MBean,但上面显示的vanilla JMX还有很长的路要走,IMO。

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

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

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

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

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

加成:

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

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

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

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

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

这里有一些不错的网络资源:

  • Oracle JMX教程
  • Java监控和管理概述
  • JMX in Action(以电子书forms提供)

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

Sun教程: 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

或者你可以在StackOverflow上看到JMX标签wiki ,我几天前更新了它,列出了你要求的内容,还有一些提供了额外的信息:

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