JMX学习笔记(三)

本章讲述一个种特殊的MBean,称为MXBean。

通过MXBean,JMX客户端不需要做特殊的配置即可处理预定义的数据类型。

与MBean一样,MXBean同样需要定义一个接口和一个实现类,不同的是接口以MXBean作为后缀,且类名和接口名不必相同。MXBean的接口还可以通过@MXBean注解定义,这样接口名就不需要MXBean后缀了。

MXBean背后的原理:通过把预定义类型映射到一组标准类型,即在包javax.management.openmbe中定义的所谓开放类型,来保证MXBean在所有客户端都可用。MXBean规范定义了映射规则,简单来说就是,私有数据类型不变,复杂类型映射到CompositeDataSupport。

举例说明MXBean的实现

  • 下面的例子通过定义一个MXBean类管理Queue<String>资源
  • MXBean定义了一个getQueueSample方法用于获取队列的快照,并且返回一个QueueSample封装类,QueueSample包含下面的信息:
    • 快照获取的时间
    • 队列的尺寸
    • 对头

接口定义

package com.example; 

public interface QueueSamplerMXBean { 
	public QueueSample getQueueSample(); 
	public void clearQueue(); 
}

类定义

package com.example; 

import java.util.Date; 
import java.util.Queue; 

public class QueueSampler 
            implements QueueSamplerMXBean { 
 
	private Queue<String> queue; 
     
	public QueueSampler (Queue<String> queue) { 
    	this.queue = queue; 
	} 
     
    public QueueSample getQueueSample() { 
        synchronized (queue) { 
            return new QueueSample(new Date(), 
                           queue.size(), queue.peek()); 
        } 
    } 
         
    public void clearQueue() { 
        synchronized (queue) { 
            queue.clear(); 
        } 
    } 
} 

定义MXBean接口返回的类型

package com.example; 
 
import java.beans.ConstructorProperties; 
import java.util.Date; 
 
public class QueueSample { 
     
    private final Date date; 
    private final int size; 
    private final String head; 
         
    @ConstructorProperties({"date", "size", "head"}) 
    public QueueSample(Date date, int size, 
                        String head) { 
        this.date = date; 
        this.size = size; 
        this.head = head; 
    } 
         
    public Date getDate() { 
        return date; 
    } 
         
    public int getSize() { 
        return size; 
    } 
         
    public String getHead() { 
        return head; 
    } 
}

注册

package com.example; 
 
import java.lang.management.ManagementFactory; 
import java.util.Queue; 
import java.util.concurrent.ArrayBlockingQueue; 
import javax.management.MBeanServer; 
import javax.management.ObjectName; 
 
public class Main { 
 
    public static void main(String[] args) throws Exception { 
        MBeanServer mbs = 
            ManagementFactory.getPlatformMBeanServer(); 
                
        ...  
        ObjectName mxbeanName = new ObjectName("com.example:type=QueueSampler");
        
        Queue<String> queue = new ArrayBlockingQueue<String>(10);
        queue.add("Request-1");
        queue.add("Request-2");
        queue.add("Request-3");
        QueueSampler mxbean = new QueueSampler(queue);
        
        mbs.registerMBean(mxbean, mxbeanName);
                 
        System.out.println("Waiting..."); 
        Thread.sleep(Long.MAX_VALUE); 
    } 
}

运行和测试

知识链

  1. JMX学习笔记(一)
  2. JMX学习笔记(二)
  3. JMX学习笔记(三)

备注

  • 本文程序片段从Java Platform Standard Edition 8 Documentation文档中摘录

参考

  • Java Platform Standard Edition 8 Documentation
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值