`
yznxing
  • 浏览: 370074 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

自动动手写原生态jmx,MbeanInfo,invoke

    博客分类:
  • java
阅读更多

 

使用jmx的东东主要包括下面几个步骤了: 
发布jmxServer。 

注册jmxBean到MBeanServer上。 
使用连接jmx的client工具来连接jmxServer。 

一:前言 
MBeanServer以及连接MBean的Client多的数不清。这里我就挑选一种经常会用到的方式来, 
本片文章主要还是为下篇 “JBOSS里使用jmx来进行监控” 做好铺垫。 
MBeanServer就采用jdk自带的MBeanServer来实现。 
client采用jconsole来连接,其它的client原理都类似。 
只有server上有一些些区别。 

二:发布一个jmxServer 

MBeanServer server = ManagementFactory.getPlatformMBeanServer(); 

因为要采用修改vm参数的方式来运行MBeanServer所以传统的MBeanServerFactory.createMBeanServer();   
需要进行修改。 

 

 

 

三:创建自己的MBean,MBeanInfo并同时实现invoke,能够让jconsole里调用方法

 

 

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.AttributeNotFoundException;
import javax.management.DynamicMBean;
import javax.management.InvalidAttributeValueException;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanConstructorInfo;
import javax.management.MBeanException;
import javax.management.MBeanInfo;
import javax.management.MBeanOperationInfo;
import javax.management.ReflectionException;
import javax.management.modelmbean.ModelMBeanAttributeInfo;
import javax.management.modelmbean.ModelMBeanOperationInfo;

/**
 * @author guoliang
 * @version 创建时间:2010-11-13 下午11:22:05 类说明
 */

public class MyMBean implements DynamicMBean {

    private String testField = "initial field value";

    public String getTestField() {
        return testField;
    }

    public void setTestField(String testField) {
        this.testField = testField;
    }

    public String testMethod(String from) {
        System.out.println("hello world" + from);
        return "hello world" + from;
    }

    @Override
    public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException {
        /**
         * 属性操作在这里进行,invoke
         */
        Class cls = this.getClass();

        try {
            String methodName = getMethodNameByField(attribute);
            Method attributeGet = cls.getMethod("get" + methodName, null);
            return attributeGet.invoke(this, null);
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    private String getMethodNameByField(String attribute) {
        String methodName = attribute.substring(0, 1).toUpperCase() + attribute.substring(1, attribute.length());
        return methodName;
    }

    @Override
    public AttributeList getAttributes(String[] attributes) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public MBeanInfo getMBeanInfo() {
        // TODO Auto-generated method stub
        try {
            Class cls = this.getClass();

            Method attributeGet = cls.getMethod("getTestField", null);
            Method attributeSet = cls.getMethod("setTestField", new Class[] { String.class });

            ModelMBeanAttributeInfo attribute = new ModelMBeanAttributeInfo("testField", "description of field",
                    attributeGet, attributeSet);

            Method m = cls.getMethod("testMethod", new Class[] { String.class });

            /**
             * 添加一个mbean中的操作,用ModelMBeanOperationInfo来实现。
             */
            ModelMBeanOperationInfo testMethod = new ModelMBeanOperationInfo("testMethod", m);

            MBeanConstructorInfo mBeanConstructorInfo = new MBeanConstructorInfo("Constructor for ServerMonitor", cls
                    .getConstructor(null));

            MBeanInfo info = new MBeanInfo(cls.getName(), "my mbean server", new MBeanAttributeInfo[] { attribute },
                    new MBeanConstructorInfo[] { mBeanConstructorInfo }, new MBeanOperationInfo[] { testMethod }, null);

            System.out.println(info.getClassName() + this.hashCode());
            return info;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    public Object invoke(String actionName, Object[] params, String[] signature) throws MBeanException,
            ReflectionException {
        /**
         * 这里用来处理jconsole里点击方法按钮调用后的操作,反射invoke过来。
         */

        System.out.println("invoking...." + actionName + "[]" + Arrays.toString(params));

        Class[] paraClass = new Class[params.length];

        for (int i = 0; i < params.length; i++) {
            paraClass[i] = params[i].getClass();
        }

        try {
            Method m = this.getClass().getMethod(actionName, paraClass);
            return m.invoke(this, params);
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;
    }

    @Override
    public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException,
            MBeanException, ReflectionException {
        /**
         * 属性操作在这里进行,invoke
         */
        Class cls = this.getClass();

        try {
            String methodName = getMethodNameByField(attribute.getName());
            Method attributeSet = cls.getMethod("set" + methodName, new Class[] { attribute.getValue()
                    .getClass() });
            attributeSet.invoke(this, attribute.getValue());
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public AttributeList setAttributes(AttributeList attributes) {
        return null;
    }

}
 



四:注册MBean:

 

 

public class MyMBeanServer { 

    public static void main(String[] args) {
//        MBeanServer server = MBeanServerFactory.createMBeanServer();
        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
        try {
            ObjectName helloName = new ObjectName("beans:name=MyMbean");
            server.registerMBean(new MyMBean(), helloName);

            Thread.sleep(Integer.MAX_VALUE);
        } catch (InstanceAlreadyExistsException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (MBeanRegistrationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NotCompliantMBeanException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (MalformedObjectNameException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NullPointerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
 

 

五:运行本程序。 

要想在jconsole里能看到本MBeanServer,还需要在启动的run里面加些参数,eclipse里面的为: 



 

启动过后,cmd命令行启动 jconsole 
选中本地的Main函数。 
在mbean栏目可以看到已经发布的MBean。 



ok!比较简单的了解下。


原生态的果然比较麻烦。不这样搞我都不知道内部是个啥东东。 

 

 

 

 

 

 

 

1
0
分享到:
评论

相关推荐

    jboss远程调用JMX

    例如,使用`queryMBeans()`方法可以列出所有注册的MBeans,`getAttribute()`和`setAttribute()`用于读写属性,`invoke()`用于调用操作。 5. **关闭连接**:在完成远程操作后,别忘了调用`JMXConnector.close()`来...

    JMX实战 JMX开发

    JMX实战 书中不仅有对于基础知识的介绍,还有对于JMX开发中重大的体系架构问题的深入探讨,总结了大量JMX开发中的设计模式,并讨论了框架、安全性与性能等等。书中提供了几个典型的例子,兼顾各种开发平台,这些...

    Jmx实例demo下载

    Java Management Extensions(JMX)是Java平台上的一个标准API,用于管理和监控应用程序、服务和设备。JMX允许开发者创建管理接口,这些接口可以被本地或远程的管理工具使用,以便监控和配置应用的状态。在本实例中...

    jmx三种访问方式

    Java Management Extensions(JMX)是Java平台中用于管理和监控应用程序、操作系统、网络设备等资源的一种标准框架。通过JMX,开发者可以创建管理代理(MBeans),这些代理暴露了各种管理特性,使得系统管理员可以...

    最简单JMX例子

    Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、服务和设备。JMX允许开发者创建管理接口,以便在运行时收集和操作应用的状态信息。本示例是一个简单的JMX实现,适合初学者...

    jmx监控activeMQ监控

    jmx监控ActiveMQ监控 jmx(Java Management Extensions)是一种Java技术,为Java应用程序提供了管理和监控的功能。ActiveMQ是Apache软件基金会下的一个开源消息队列系统,提供了高效、可靠的消息传递服务。在生产...

    Hbase和Hadoop JMX监控实战

    4. 设置阈值报警,当某些关键指标超过预设值时,自动触发警报通知。 5. 可以考虑将JMX数据集成到第三方监控系统(如Prometheus、Grafana或Zabbix)中,实现可视化展示和告警。 在实际操作中,`hbase-monitor`这个...

    jmx监控weblogic,tomcat,websphere源码

    通过JMX,开发者可以实现自定义的监控解决方案,例如收集性能指标、触发警报或自动调整系统设置。这个项目为那些希望深入了解Java应用服务器监控并实现定制化管理的人员提供了一个有价值的参考。理解JMX的工作原理和...

    jmx-tools.zip

    在实际应用中,`jmx-tools`中的工具可以帮助开发者监控和诊断应用程序的性能问题,进行故障排查,以及进行自动化运维。例如,通过`HtmlAdaptorServer`,开发人员可以创建自定义的监控页面,展示关键性能指标,或者...

    jmx-1.2.1(jmxri+jmxtools) jar

    JMX广泛应用于系统监控、性能分析、故障诊断和自动化管理等领域。例如,它可以用来监控内存使用、线程状态、数据库连接池等。在大型分布式系统中,JMX通过提供标准化的管理接口,使得运维人员能有效地管理和维护...

    书籍JMX-IN-ACTION

    《JMX in Action》是一本深入探讨Java管理扩展(Java Management Extensions, JMX)技术的专业书籍,对于希望理解和掌握JMX的IT从业者来说,是一份不可或缺的参考资料。JMX是Java平台上的一个标准组件,它提供了管理...

    JMX一步一步来,快速学会开发JMX应用

    【JMX 一步步来】 JMX(Java Management Extensions)是一个用于在Java应用程序中添加管理和监控功能的框架。它提供了一套标准的接口和服务,使得开发者能够轻松地在Java应用中集成管理和监控的能力。JMX的核心概念...

    JMX开发入门

    Java Management Extensions(JMX)是一种Java平台上的框架,用于管理和监控应用程序、系统和服务。...总的来说,JMX因其灵活性、标准化和广泛的生态系统支持,成为了Java环境中不可或缺的管理工具。

    JMX与Spring 结合

    在实际应用中,JMX与Spring的结合可以通过Spring Boot进一步简化,Spring Boot自动配置了JMX支持,只需要简单的配置就能开启远程监控。同时,JConsole和VisualVM等工具可以帮助我们直观地查看和操作通过JMX暴露的...

    jmxri-1.2.1.jar+jmxtools-1.2.1.jar

    Java Management Extensions (JMX) 是Java平台上的一个标准技术,用于管理和监控应用程序、操作系统和网络设备。`jmxri-1.2.1.jar` 和 `jmxtools-1.2.1.jar` 是与JMX相关的两个核心库文件,它们在Java应用程序中扮演...

    使用jmx所需的jar包

    它可以帮助自动化JMX数据的收集,便于集成到监控解决方案中。 4. `jmxtools.jar`: 这是JMX Tools JAR文件,包含了用于本地和远程JMX操作的实用工具和API。例如,`jconsole`就是基于这个JAR包的,它是一个图形化的...

    jmx中包含的主要API

    Java Management Extensions (JMX) 是 Java 平台中用于管理和监控应用程序、系统和服务的一个标准框架。JMX API 提供了一套接口和类,使得开发者能够创建管理工具、服务和组件,以便于监视和控制运行时的环境。在这...

    网络管理之jmx开发实战

    ### 网络管理之JMX开发实战 #### JMX技术概述 JMX(Java Management Extensions)是一种标准的Java技术,用于管理和监控应用程序、设备、系统等资源。它提供了多种方式来管理Java应用,包括使用MBeans(Managed ...

    Fiddler导出jmx文件

    Fiddler导出jmx文件,解决Fiddler导出文件中 没有jmx文件选项,各个版本fiddler都适用

Global site tag (gtag.js) - Google Analytics