利用JBossMX开发标准MBean(经典!转)

2023-10-19 13:32

本文主要是介绍利用JBossMX开发标准MBean(经典!转),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文(http://www.ebook520.com/showbooktext.asp?id=2090&backcolor=E7F4FE&backsize=15)  

JBoss 服务器是建立在 JBoss JMX 实现工具( JBossMX )基础上的,访问 JBoss 网站( http://www.jboss.org )可以下载到独立的 JBoss JMX 实现工具软件包 。将下载到的 jbossmx-1.1.2.zip 压缩包解压之后,把下列 jar 文件添加到 CLASSPATH 中:

jbossmx-1.1.2/jbossmx-1.1.2/lib/jboss-jmx.jar

jbossmx-1.1.2/jbossmx-1.1.2/lib/jboss-jmx-core.jar

JBOSS_HOME/client/gnu-regexp.jar

JBOSS_HOME/client/jbossall-client.jar

标准

MBean JBoss 中使用范围最广, JBoss 中的许多组件都是利用标准 MBean 开发的。

1 .计数器 MBean

下面是一个计数器 MBean 的开发示例。

1 )确定 MBean 的接口。

分析计数器的功能,确定了两个方法, add() get() add() 负责加数, get() 责加数并取回总数:

package com.liuyang.jmx.mbeans.counter;

public interface CounterMBean {

    public void add(int num);

    public int get(int num);   

}

从代码中可以看到,开发标准 MBean MBean 接口和开发普通接口除了需要在 MBean 类名称后面加上“ MBean ”之外,没有其他区别。

2 )实现 MBean 接口。

CounterMBean 是一个标准 MBean ,所以 MBean 实现类的名称必须和 MBean 接口 之间遵守标准 MBean 的命名规范,所以 CounterMBean 的实现类 Counter CounterMBean 少了尾部的 MBean 部分,下面是 Counter 的实现代码:

package com.liuyang.jmx.mbeans.counter;

public class Counter implements CounterMBean {

                    int sum = 0;

public void add(int num) {

sum+=num;

}

public int get(int num) {

sum+=num;

return sum;

}

}

从代码中也可以看到,标准 MBean 实现类与普通的 Java 程序也没什么区别。

3 )利用 JMX API 编写调用 CounterMBean 的程序。

JMX API Sun 公司为 JMX 技术所设计的一套用来开发 JMX 应用的编程接口,通过 JMX API 可以管理和控制前面开发的 CounterMBean 资源。下面是利用 JMX API 编写调用 CounterMBean 的程序代码:

package com.liuyang.jmx.mbeans.counter;

import javax.management.MBeanServer;

import javax.management.MBeanServerFactory;

import javax.management.ObjectName;

public class CounterServer {

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

MBeanServer server = MBeanServerFactory.createMBeanServer();

ObjectName name = new ObjectName("book.liuyang:service=Counter");

server.registerMBean(new Counter(), name);   

String[] sig1 = {"int"};

Object[] opArgs1 = {new Integer(3)};

Object result1 = server.invoke(name, "add", opArgs1, sig1);

System.out.println(result1);     

 

String[] sig2 = {"int"};

Object[] opArgs2 = {new Integer(0)};

Object result2 = server.invoke(name, "get", opArgs2, sig2);

System.out.println(result2);             

}

}

2 ObjectName

ObjectName 代表一个 MBean 对象的名,创建一个 ObjectName 需要符合 MBean 的命名规范,例如:

ObjectName name = new ObjectName("book.liuyang:service=Counter");

3 MBeanServer

CounterServer 程序中,首先创建的 MBeanServer 这个对象代表前文中介绍的 MBean 服务器,它负责管理 MBean 资源,每个 MBean 资源可以被注册到 MBeanServer 之中:

server.registerMBean(new Counter(), name);

通过 MBeanServer invoke 方法还可以调用一个 MBean ,在调用时需要传递一些与调用有关的参数:

Object result1 = server.invoke(name, "add", opArgs1, sig1);

其中:

name 是被调用对象的对象名。

"add" 要求 调用被调对象的方法名称。

opArgs1 是一个数组,包含着的每个数据将被作为参数传递到被调方法。

sig1 一个数组,包含着将被作为参数传递的每个数据的数据类型。

调用之后返回的对象包含着执行的结果。

4 MBeanServerFactory

MBeanServerFactory 是产生 MBeanServer 的工厂类,使用的 JMX 实现工具不同,通过 MBeanServerFactory 创建的 MBeanServer 实现对象也不同。如果 MBeanServer 已经被创建了,那么可以通过下面的方法获取:

MBeanServer server = MBeanServerFactory.newMBeanServer();

通过这个实例,可以了解到使用 MBeanServer 来控制 MBean 的基本方法,下面的 用户查询 MBean 将进一步介绍通过 MBeanServer MBean 的属性进行查询的方法。

5 .用户查询 MBean

首先,确定 MBean 的接口。

用户查询 MBean 中的用户是这个 MBean 所代表的对象,这个设计的用户包括名称和角色,在这个例子中将对这两个属性进行监控,这是 JMX 为开发者提供的一种机制,所有被管理的 MBean 都在 MBeanServer 的控制之中,这个控制不仅包括上个计数器实例中所演示的方法调用功能,也包含对这些 MBean 的相关信息进行考察的功能。

package com.liuyang.jmx.mbeans.user;

public interface UserMBean {

    public String getName();

    publicvoid setName(String name);

    public String getRole();

    public void setRole(String string);

}

UserMBean 中被设定了两个属性: name role ,并遵照 Java Bean 的规则为它们提供了 get() set() 方法。通过这两个方法可以设定 UserMBean 的两个属性。

package com.liuyang.jmx.mbeans.user;

public class User implements UserMBean  {

    private String name = "";

    private String password  = "";

    private String role  = "";

    public String getName() {

    return name;

    }

    publicvoid setName(String name) {

        this.name = name;

    }

public String getRole() {

return role;

}

public void setRole(String string) {

role = string;

}

}

User 这个类只是以最简单的方式实现了 UserMBean 接口。

UserQueries 演示了 通过 MBeanServer MBean 的属性进行查询的方法,代码如下:

package com.liuyang.jmx.mbeans.user;

import java.util.Iterator;

import java.util.Set;

import javax.management.Attribute;

import javax.management.MBeanServer;

import javax.management.MBeanServerFactory;

import javax.management.ObjectName;

import javax.management.Query;

import javax.management.QueryExp;

public class UserQueries {

  publicstaticvoid main(String[] args) throws Exception {

    MBeanServer server = MBeanServerFactory.createMBeanServer();

    ObjectName user1 = new ObjectName("book.liuyang:Name=user1");

    ObjectName user2 = new ObjectName("book.liuyang:Name=user2");

    server.createMBean("com.liuyang.jmx.mbeans.user.User", user1);

    server.createMBean("com.liuyang.jmx.mbeans.user.User", user2);

    server.setAttribute(user1, new Attribute("Name", "user1"));

    server.setAttribute(user2, new Attribute("Name", "user2"));

    server.setAttribute(user1, new Attribute("Role", "code"));

    server.setAttribute(user2, new Attribute("Role", "test"));

QueryExp exp = Query.match(Query.attr("Name"),Query.value("user1"));

ObjectName scope = new ObjectName("book.liuyang:*");   

Set set      = server.queryNames(scope, exp);   

Iterator it  = set.iterator();

System.out.println(" 下列 MBean 的名字是: user1");

while (it.hasNext()) {

  System.out.println(it.next());   

}

scope = new ObjectName("book.liuyang:*");   

exp = Query.initialSubString(Query.attr("Role"),Query.value("t"));

set   = server.queryNames(scope, exp);   

it    = set.iterator();

System.out.println(" 下列 MBean 的角色是: test");

while (it.hasNext()) {

  System.out.println(it.next());

}

}

}

UserQueries 中创建了两个 MBean 对象:

server.createMBean("com.liuyang.jmx.mbeans.user.User", user1);

这是 MBeanServer 通过 MBean 类的名称创建 MBean 实例的方法。

然后分别设置它们的属性:

server.setAttribute(user1, new Attribute("Name", "user1"));

一个 Attribute 对象代表一个属性。

JMX API 为查询服务建立标准的接口方法,第一步是建立查询表达式:

QueryExp exp = Query.match(Query.attr("Name"),Query.value("user1"));

这个查询表达式是以全匹配的方式进行的, JMX 还支持部分模糊查询的功能:

exp = Query.initialSubString(Query.attr("Role"),Query.value("t"));

initialSubString 建立的查询方法只会匹配名称的开始部分,在这里只要以“ t ”开头的值都会被匹配。

然后,通过一个 MBean 名称对象来代表查询范围:

ObjectName scope = new ObjectName("book.liuyang:*");

最后,通过 MBeanServer 执行查询表达式的操作,得到结果:

Set set = server.queryNames(scope, exp);  

运行 UserQueries 可以得到查询结果。

 

这篇关于利用JBossMX开发标准MBean(经典!转)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/240120

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

基于Python开发PPTX压缩工具

《基于Python开发PPTX压缩工具》在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储,所以本文将使用Python开发一个PPTX压缩工具,需要的可以了解下... 目录引言全部代码环境准备代码结构代码实现运行结果引言在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE