Basic Introduction to JMX – JMX的基本介绍

最后修改: 2017年 1月 1日

中文/混合/英文(键盘快捷键:t)

1. Introduction

1.介绍

The Java Management Extensions (JMX) framework was introduced in Java 1.5 and has found widespread acceptance in the Java developers community since its inception.

Java管理扩展(JMX)框架是在Java 1.5中引入的,自其诞生以来,在Java开发者社区中得到了广泛的认可。

It provides an easily configurable, scalable, reliable and more or less friendly infrastructure for managing Java application either locally or remotely. The framework introduces the concept of MBeans for real-time management of applications.

它为本地或远程管理Java应用程序提供了一个易于配置、可扩展、可靠且友好的基础设施。该框架引入了MBeans的概念,用于对应用程序进行实时管理。

This article is a beginner’s step by step guide to create and setup a basic MBean and manage it through JConsole.

本文是一个初学者的步骤指南,以创建和设置一个基本的MBean,并通过JConsole来管理它。

2. JMX Architecture

2.JMX架构

JMX architecture follows a three-layered approach:

JMX架构遵循一个三层的方法。

  1. Instrumentation layer: MBeans registered with the JMX agent through which resources are managed
  2. JMX agent layer: the core component (MbeanServer) which maintains registry of managed MBeans and provides an interface to access them
  3. Remote management layer: usually client side tool like JConsole

3. Creating an MBean Class

3.创建一个MBean类

While creating MBeans, there is a particular design pattern which we must conform to. The model MBean class MUST implement an interface with the following name: “model class name” plus MBean.

在创建MBeans时,有一个特定的设计模式,我们必须遵守。模型MBean类必须实现一个接口,其名称如下。“模型类名称 “加MBean.

So let’s define our MBean interface and the class implementing it:

因此,让我们来定义我们的MBean接口和实现它的类。

public interface GameMBean {

    public void playFootball(String clubName);

    public String getPlayerName();

    public void setPlayerName(String playerName);

}
public class Game implements GameMBean {

    private String playerName;

    @Override
    public void playFootball(String clubName) {
        System.out.println(
          this.playerName + " playing football for " + clubName);
    }

    @Override
    public String getPlayerName() {
        System.out.println("Return playerName " + this.playerName);
        return playerName;
    }

    @Override
    public void setPlayerName(String playerName) {
        System.out.println("Set playerName to value " + playerName);
        this.playerName = playerName;
    }
}

The Game class overrides a method playFootball() of the parent interface. Apart from this, the class has a member variable playerName and getter/setter for it.

Game类重写了父接口的一个方法playFootball()。除此之外,该类有一个成员变量playerName和它的getter/setter。

Note that getter/setter are also declared in the parent interface.

注意,getter/setter也在父接口中声明。

4. Instrumenting With the JMX Agent

4.用JMX代理进行检测

JMX agents are the entities running either locally or remotely which provide the management access to the MBeans registered with them.

JMX代理是在本地或远程运行的实体,为在它们那里注册的MBeans提供管理访问。

Let’s use PlatformMbeanServer – the core component of JMX agent and register the Game MBean with it.

让我们使用PlatformMbeanServer–JMX代理的核心组件,用它来注册GameMBean。

We’ll use another entity – ObjectName – to register the Game class instance with the PlatformMbeanServer; this is a String consisting of two parts:

我们将使用另一个实体–ObjectName–来向PlatformMbeanServer注册Game类实例;这是一个由两部分组成的字符串。

  • domain: can be an arbitrary String, but according to MBean naming conventions, it should have Java package name (avoids naming conflicts)
  • key: a list of “key=value” pairs separated by a comma

In this example, we’ll use: “com.baledung.tutorial:type=basic,name=game”.

在这个例子中,我们将使用。“com.baledung.tutorial:type=basic,name=game”。

We’ll get the MBeanServer from the factory class java.lang.management.ManagementFactory.

我们将从工厂类java.lang.management.ManagementFactory.获取MBeanServer

Then we’ll register the model MBean using the created ObjectName:

然后我们将使用创建的ObjectName:注册模型MBean。

try {
    ObjectName objectName = new ObjectName("com.baeldung.tutorial:type=basic,name=game");
    MBeanServer server = ManagementFactory.getPlatformMBeanServer();
    server.registerMBean(new Game(), objectName);
} catch (MalformedObjectNameException | InstanceAlreadyExistsException |
        MBeanRegistrationException | NotCompliantMBeanException e) {
    // handle exceptions
}

Finally, just to be able to test it – we’ll add a while loop to prevent the application from terminating before we can access the MBean through JConsole:

最后,只是为了能够进行测试–我们将添加一个while循环,以防止应用程序在我们通过JConsole访问MBean之前终止。

while (true) {
}

5. Accessing the MBean

5.访问MBean

5.1. Connecting from the Client Side

5.1.从客户端连接

  1. Start the application in the Eclipse
  2. Start Jconsole (located in the bin folder of the JDK installation directory of your machine)
  3. Connection -> new Connection -> select the local Java process of this tutorial -> Connect ->Insecure SSl connection warning -> Continue with insecure connection
  4. After connection is established, click on the top right MBeans tab of the View pane
  5. List of registered MBeans will appear in left column
  6. Click com.baeldung.tutorial -> basic -> game
  7. Under game, there will be two rows, one each for attributes and operations

Here’s a quick look at the JConsole part of the process:

下面是对该过程中JConsole部分的简单介绍。

edited jmx tutorial

5.2. Managing the MBean

5.2.管理MBean

The basics of MBean management are simple:

MBean管理的基本原理很简单。

  • Attributes can read or written
  • Methods can be invoked and arguments can be supplied to them or values returned from them

Let’s see what that means for the Game MBean in practice:

让我们看看这对Game MBean在实践中意味着什么。

  • attribute: type a new value for the attribute playerName – for example “Messi” and click Refresh button

The Following log will appear in the Eclipse console:

以下日志将出现在Eclipse控制台。

Set playerName to value Messi

设置球员姓名为梅西

  • operations: type a value for the String argument of method playFootBall() – for example “Barcelona” and click on the method button. A window alert for successful invocation will appear

The following log will appear in the eclipse console:

以下日志将出现在eclipse控制台。

Messi playing football for Barcelona

梅西为巴塞罗那踢球

6. Conclusion

6.结论

This tutorial touched upon the basics of setting up a JMX-enabled application by use of MBeans. Also, it discussed about using a typical client-side tool like JConsole to manage the instrumented MBean.

本教程介绍了通过使用MBeans设置支持JMX的应用程序的基础知识。此外,它还讨论了使用典型的客户端工具(如JConsole)来管理仪器化的MBean。

The domain of JMX technology is very wide in scope and reach. This tutorial can be considered a beginner’s step towards that.

JMX技术的领域非常广泛,涉及面也很广。本教程可以被认为是初学者迈向这个领域的第一步。

The source code of this tutorial can be found over on Github.

本教程的源代码可以在Github上找到over