一共有四种MBean:
标准MBean(Standard MBeans)设计和实现是最简单的,这类MBean使用自己的方法名作为管理接口。
动态MBean(Dynamic MBeans)必须实现一个指定的接口,由于动态MBeans在运行期间暴露它们的管理接口,因此更为灵活。
开放MBean(Open MBeans)属于动态MBeans,这类MBean依靠基础数据类型来实现通用管理,并为友情用户进行自我声明。
模型MBean(Model MBeans)同样也是动态MBeans,这类MBeans是完全可配置的,在运行期间进行自我声明;它们为资源动态工具提供一个一般性的,有默认行为的MBeans类。
下面将演示标准MBean和模型MBean的使用方法。
以下演示的源码地址:https://github.com/smallbug-vip/repo,除此之外自己在网上还搜索了一个动态MBean的Demo。
标准MBean:
首先定义被管理的bean:
public class Bug implements BugMBean{
private String name;
private String food;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFood() {
return food;
}
public void setFood(String food) {
this.food = food;
}
public void eat(String eat) {
System.out.println("the bug is eating " + eat + ".");
}
@Override
public String toString() {
return "Bug [name=" + name + ", food=" + food + "]";
}
}
该Bean实现了一个名称以MBean结尾的接口,这个接口中声明的方法都是Bean对象要向外暴露的操作接口方法。
public interface BugMBean {
/**
* 获取名字
*
* @timestamp Feb 10, 2016 3:22:58 PM
* @return
*/
public String getName();
/**
* 设置名字
*
* @timestamp Feb 10, 2016 3:23:23 PM
* @param name
*/
public void setName(String name);
/**
* 最喜欢的食物是什么
*
* @timestamp Feb 10, 2016 3:23:37 PM
* @return
*/
public String getFood();
/**
* 设置最喜欢的食物
*
* @timestamp Feb 10, 2016 3:23:55 PM
* @param food
*/
public void setFood(String food);
/**
* 吃
*
* @timestamp Feb 10, 2016 3:24:08 PM
* @param eat
*/
public void eat(String eat);
/**
* 查看状态
*
* @timestamp Feb 10, 2016 3:24:15 PM
* @return
*/
public String toString();
}
使用工具Adaptor测试代码:
try {
helloName = new ObjectName("smallbug:name=Bug");
server.registerMBean(new Bug(), helloName);
ObjectName adapterName = new ObjectName("StandardAgent:name=htmladapter,port=8082");
HtmlAdaptorServer adapter = new HtmlAdaptorServer();
server.registerMBean(adapter, adapterName);
adapter.start();
System.out.println("start.....");
} catch (Exception e) {
throw new RuntimeException(e);
}
之后可以在浏览器中输入:localhost:8082来管理Bug对象了。注意要使用HtmlAdaptorServer必须在pom.xml中引入:
<dependency>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
<version>1.2.1</version>
</dependency>
也可以不使用Adapter:
private void test02() {
try {
helloName = new ObjectName("smallbug:name=Bug");
server.registerMBean(new Bug(), helloName);
changeProperties();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private void changeProperties() {
Attribute name = new Attribute("Name", "smallbug");
Attribute food = new Attribute("Food", "leaves");
try {
server.setAttribute(helloName, name);
server.setAttribute(helloName, food);
System.out.println("the name is " + server.getAttribute(helloName, "Name"));
Object[] params = { "beans" };
String[] sign = { "java.lang.String" };
server.invoke(helloName, "eat", params, sign);
String s = (String) server.invoke(helloName, "toString", null, null);
System.out.println(s);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
模板MBean:
被管理Bean除了不实现接口,其他与上面Bug一样。然后定义BugMBean类,该类继承了BaseModelMBean:
public class BugMBean extends BaseModelMBean {
public BugMBean() throws MBeanException, RuntimeOperationsException {
super();
}
@Override
public String getClassName() {
return (this.resource.getClass().getName());
}
@Override
public Object getAttribute(String name) throws AttributeNotFoundException, MBeanException, ReflectionException {
System.out.println("-------------------" + name);
return super.getAttribute(name);
}
@Override
public void setAttribute(Attribute attribute) throws AttributeNotFoundException, MBeanException, ReflectionException {
System.out.println("+++++++++++++++++++" + attribute);
super.setAttribute(attribute);
}
}
对需要暴露的接口进行配置:
<?xml version="1.0"?>
<!DOCTYPE mbeans-descriptors PUBLIC
"-//Apache Software Foundation//DTD Model MBeans Configuration File"
"http://jakarta.apache.org/commons/dtds/mbeans-descriptors.dtd">
<mbeans-descriptors>
<mbean name="myMBean" className="cn.smallbug.jdk.jmx._02.BugMBean"
type="cn.smallbug.jdk.jmx._02.Bug">
<attribute name="Name" type="java.lang.String" />
<attribute name="Food" type="java.lang.String" />
<operation name="eat" impact="ACTION" returnType="void">
<parameter name="eat" type="java.lang.String" />
</operation>
<operation name="toString" impact="ACTION" returnType="java.lang.String">
<parameter name="eat" type="java.lang.String" />
</operation>
</mbean>
</mbeans-descriptors>
测试:
public class ModelAgent {
private Registry registry;
private MBeanServer mBeanServer;
public ModelAgent() {
registry = createRegistry();
try {
mBeanServer = Registry.getServer();
} catch (Throwable t) {
t.printStackTrace(System.out);
System.exit(1);
}
}
public MBeanServer getMBeanServer() {
return mBeanServer;
}
public Registry createRegistry() {
Registry registry = null;
try {
URL url = ModelAgent.class.getResource("/jmx/bug-mbean.xml");
InputStream stream = url.openStream();
Registry.loadRegistry(stream);
stream.close();
registry = Registry.getRegistry();
} catch (Throwable t) {
System.out.println(t.toString());
}
return (registry);
}
public ModelMBean createModelMBean(String mBeanName) throws Exception {
ManagedBean managed = registry.findManagedBean(mBeanName);
if (managed == null) {
System.out.println("ManagedBean null");
return null;
}
ModelMBean mbean = managed.createMBean();
ObjectName objectName = createObjectName();
return mbean;
}
private ObjectName createObjectName() {
ObjectName objectName = null;
String domain = mBeanServer.getDefaultDomain();
try {
objectName = new ObjectName(domain + ":type=MyCar");
} catch (MalformedObjectNameException e) {
e.printStackTrace();
}
return objectName;
}
public static void main(String[] args) {
ModelAgent agent = new ModelAgent();
MBeanServer mBeanServer = agent.getMBeanServer();
Bug bug = new Bug();
System.out.println("Creating ObjectName");
ObjectName objectName = agent.createObjectName();
try {
ModelMBean modelMBean = agent.createModelMBean("myMBean");
modelMBean.setManagedResource(bug, "ObjectReference");
mBeanServer.registerMBean(modelMBean, objectName);
} catch (Exception e) {
System.out.println(e.toString());
}
// manage the bean
try {
Attribute name = new Attribute("Name", "smallbug");
Attribute food = new Attribute("Food", "leaves");
mBeanServer.setAttribute(objectName, name);
mBeanServer.setAttribute(objectName, food);
String color = (String) mBeanServer.getAttribute(objectName, "Name");
System.out.println("Name:" + color);
Object[] params = { "beans" };
String[] sign = { "java.lang.String" };
mBeanServer.invoke(objectName, "eat", params, sign);
String s = (String) mBeanServer.invoke(objectName, "toString", null, null);
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
Java分布式应用学习笔记09JMX-MBean的介绍
NULL 博文链接:https://jasonhan-sh-hotmail-com.iteye.com/blog/1171904
jmx 实例 rmi mbean,采用rmi方式进行jmx的mbean管理,通过这个实例能够了解jmx的应用
JMX 1.2.1 Reference Implementation(重点) Include com.sun.jdmk.comm.HtmlAdaptorServer class http://www.sun.com/software/jdmk/ Downloads, sun-jdmk-runtime-5.1-b34.2.zip/SUNWjdmk/5.1/lib/jdmkrt.jar
java
JMX是指Java管理扩展,通过jmx可以监控java应用服务器的各项性能指标,jvm的性能指标等
1.JMX与SPRING 结合实例 2.标准MBean 与非标准MBean 注册 3.基于接口和注解的MBean 注册 4.发布通知,处理通知及配置
jmx监控MBean测试; ArchUnit参数验证;跨域处理; shiro权限控制;静态资源,“ /”映射服务启动注册到consul;并测试获取redis服务,初始化redis资源; consul监控redis服务; reids分布式锁;注意consul客户端和...
通用 JMX MBean 收集器,它使用 Boundary API 创建指标并发布它们。 这个 java 应用程序读取一个配置文件,其名称作为参数传递。 配置文件是一个 JSON 结构,它定义了 JMX 连接、要收集的 MBean 属性以及边界度量...
JMX到Prometheus导出器:一个收集器,该收集器可以可配置地抓取和公开JMX目标的mBean。 该导出程序旨在作为Java代理运行,公开HTTP服务器并提供本地JVM的度量。 它也可以作为独立的HTTP服务器运行,并刮擦远程JMX...
jmx-mbeans 创建了自定义Mbean类,以接收一些简单操作(如求和操作)的度量。 创建了MBeanServer并注册了自定义Mbean类。 使用jconsole工具连接到我的... 在jconsole中,能够查看自定义Mbean属性,操作和通知。
JMX越来越多得出现在各种技术杂志、以及社区,如ibm的 developerworks和bea的dev2dev。不仅仅是SUN,许多厂商都宣布已经或是准备支持这一技术。IBM、BEA、HP、Marcomedia(JRun)这些大的厂商,而且还有许多小的软件...
本课程介绍JMXAPI的基本概念,它被称之为被管理的bean,或者MBean。MBean是一个被管理的Java对象,就像Javabean组件一样,但是它遵从JMX规范的设计模式。MBean可以表示设备、应用或者任何需要被管理的资源。MBeans...
NULL 博文链接:https://90haofang-163-com.iteye.com/blog/1901416
分析了当前网络监控中面临的主要问题,提出了采用JMX方案来解决的办法。介绍了JMX的技术特点,并采用该技术实现了IP网络管理中的网络监控任务的调配和管理。
jmx与osgi结合的实例,将osgi的bundle注册到jmx进行管理。简单实例,可以进行扩展
jmx转储 在命令行上将JMX指标转储为JSON。 安装 从下载独立的二进制文件或jar。 也可以通过自制水龙头使用 brew tap r4um/homebrew brew install jmx-dump 旧版本。 用法 使用发行版中的独立二进制文件或jar。 $ ...
jmxutils.zip,导出jmx mbean使导出jmx mbean变得容易
目前实时给出一些监控统计,后续会更新更多功能特征目前可以使用以下功能: JVM 监控统计服务器线程池运行时统计服务器统计JDBC 数据源统计信息应用程序部署列表和状态世贸中心现状概念WeblogicJMX 使用 Java JMX ...
在JMX中MBean代表一个被管理的资源实例,通过MBean中暴露的方法和属性,外界可以获取被管理的资源的状态和操纵MBean的行为。 Agent 用来管理相应的资源,并且为远端用户提供访问的接口。该层的核心是MBeanServer,...