JMX 之 MBean Server

MBean Server 是 JMX 的核心组件。
在代理上,所有的 MBean 都会注册到 MBean Server, MBean Server 提供了操作 MBean 的服务。
注册在 MBean Server 上的 MBean 具有以下特点:

  • MBean 代表着被管理的资源
  • 对于代理提供管理功能
  • 一些框架组件,例如 服务器连接器和协议适配器,能被 MBean 实现。

JMX 代理有一个工厂类,可以通过静态方法查找或者创建一个 MBean Server。

MBeanServer mBeanServer = MBeanServerFactory.createMBeanServer();

JDK 5 ,推荐使用

MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();

MBean的两种注册方式

  • 通过一个操作完成创建 MBean 和注册 MBean。
  • 注册一个已经存在的MBean实例。

MBean 注册控制

开发者通过 MBean Server 来注册和注销MBean,可以在MBean实现MBeanRegistration 接口。

实现 MBeanRegisteration 接口,必须实现以下方法:

  • preRegister: MBean在注册MBean Server 之前被调用。
  • postRegister:MBean在注册MBean Server 之后被调用。
  • preDeregister: MBean在注销MBean Server 之前被调用。
  • postDeregister:MBean在注销MBean Server 之后被调用。

以下是方法调用图

process.jpg

另外还可以通过代理的方式实现。
javax.management.JMX#newMBeanProxy(javax.management.MBeanServerConnection, javax.management.ObjectName, java.lang.Class<T>)

远程操作 MBean

一般,一个远程的客户端可以通过MBeanServerConnection调用MbeanServer的一系列方法。

remote.jpg

MBean Server 通知

当 MBean 注册和注销的时候,MBean Server 都会发送通知。对于注册MBean Server通知,监听器将会调用 MBean Server的addNotificationListener,当MBean 接受通知,MBean对象必须实现 NotificationListener 接口来接受MBean Server的通知。
实例:
增加Maven依赖:

<dependency>  
 <groupId>org.glassfish.external</groupId>  
 <artifactId>opendmk_jdmkrt_jar</artifactId>  
 <version>1.0-b01-ea</version>  
</dependency>

HelloMBean.java

public interface HelloMBean {  
    String getName();  

 void setName(String name);  

 void printHello();  

 void printHello(String name);  
}

Hello.java

public class Hello implements HelloMBean {  

    private String name;  

  @Override  
  public String getName() {  
        return name;  
  }  

    @Override  
  public void setName(String name) {  
        this.name = name;  
  }  

    @Override  
  public void printHello() {  
        System.out.println("name = " + name);  
  }  

    @Override  
  public void printHello(String name2) {  
        System.out.println("name = " + name2);  
  }  
}

HelloListener.java

public class HelloListener implements NotificationListener {  
    @Override  
  public void handleNotification(Notification notification, Object handback) {  
        System.out.println("type=" + notification.getType());  
  System.out.println("seq=" + notification.getSequenceNumber());  
  System.out.println("send time=" + notification.getTimeStamp());  
  System.out.println("message=" + notification.getMessage());  
 if(handback instanceof Hello){  
            Hello hello = (Hello) handback;  
  hello.printHello(notification.getMessage());  
  }  
    }  
}

JackMBean.java

public interface JackMBean {  

    void greeting();  
}

Jack.java

public class Jack extends NotificationBroadcasterSupport implements JackMBean {  

    private AtomicInteger seq = new AtomicInteger(0);  

  @Override  
  public void greeting() {  
        Notification notification = new Notification("hello", this, seq.incrementAndGet(),  
  System.currentTimeMillis(), "hello world");  
  sendNotification(notification);  
  }  
}

HelloAgent.java

public class HelloAgent {  
    public static void main(String[] args) throws Exception {  

        MBeanServer server = MBeanServerFactory.createMBeanServer();  
  String domain = "MyMBean";  
  ObjectName helloName = new ObjectName(domain+":name=hello");  
  Hello hello = new Hello();  
  server.registerMBean(hello, helloName);  

  ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");  
  HtmlAdaptorServer adaptorServer = new HtmlAdaptorServer();  
  server.registerMBean(adaptorServer, adapterName);  

  Jack jack = new Jack();  
  server.registerMBean(jack, new ObjectName("HelloAgent:name=jack"));  
  jack.addNotificationListener(new HelloListener(), null, hello);  

  adaptorServer.start();  
  System.out.println("server start...");  

  }  
}

通过方法 localhost:8082, 执行greeting方法来发送通知。
QQ截图20190216233155.jpg

仅有 1 条评论
  1. 6666666666

添加新评论