[JMX一步步来] 9、基于JBoss来写MBean

前面都是用JDK自带的JMX实现来写的MBean,JMX的实现不独SUN一家,JBOSS也有自己的JMX实现。如果你使用JBOSS来做WEB服务器,那么基于JBOSS的实现来写MBean,是一个不错的选择。象我们公司就是用JBOSS的,因此所有MBean都是基于JBoss来写的。基于JBoss的MBean和基于SUN的MBean有什么不同吗?有一些不同之外,但绝大部份都一样。
下面是我最早发的一篇关于JMX的文章,是我对公司所做项目的笔记,它上面的JMX例子就是基于JBOSS的。博客搬了几次家,文章删的删丢的丢,但这篇文章还保留着,简单修改一下,再帖上吧。

一、  HelloWorld实例

1、准备工作

  JBOSS实现了JMX规范,这个实例是基于JBOSS来实现的。请先去下载一个JBOSS,我是jboss-3.2.6,下载地址:http://www.jboss.com/downloads/index#as。这个实例需要JBOSS的两个JAR包的支持:jboss-system-3.2.6.jarjboss-jmx-3.2.6.jar,如果你和我一样用Eclipse来开发(推荐),那么把这个两个包加入到项目的库引用中(加入到库引用的方法参考前面两章)。

2、程序代码

  假设我们有一个叫message的属性要需要经常进行改动配置的,那么我们就把它写成一个MBean

1HelloWorldServiceMBean接口

  在写MBean之前,我们先需要写一个MBean接口,接口里的方法都是属性的set/get方法。这个接口必须继承接口ServiceMBean


import org.jboss.system.ServiceMBean;
public interface HelloWorldServiceMBean extends ServiceMBean {
String getMessage();
void setMessage(String message);
}

2HelloWorldService实现类

  然后写出HelloWorldServiceMBean接口的实现类HelloWorldService,这个实现类还必须继承ServiceMBeanSupport类。这种类再简单不过了,就是属性和相应的set/get方法,EJB中叫实体类、Hibernate中叫POJO

import org.jboss.system.ServiceMBeanSupport;
public class HelloWorldService extends ServiceMBeanSupport implements HelloWorldServiceMBean {
    private String message;
    public String getMessage() {
        System.out.println("getMessage()=" + message);
        return message;
    }

    public void setMessage(String message) {
        System.out.println("setMessage(" + message + ")");
        this.message = message;
    }
}

3、配置文件jboss-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<server>
    <mbean code="example.mbean.HelloWorldService" name="www.chengang.com.cn:service=HelloWorld">
        <attribute name="Message">Hello World</attribute>
    </mbean>
</server>

说明:

l code项指向MBean的实现类HelloWorldService
l name项是一个名称,格式一般是:[说明性文字]:service=[类名]
l attribute是为属性设置初始值,这样当JBOSS一加载HelloWorldService类时,message属性就有了一个初始值Hello World。注意Message的第一个字母必须是大写。

二、将实例部署到JBOSS

  在jboss-3.2.6\server\default\deploy目录下创建一个hello.sar目录,然后创建如下目录文件结构:

hello.sar
|----example
|            |----mbean
|                    |----HelloWorldService.class  (注意:是*.class,不是*.java)
|                    |----HelloWorldServiceMBean.class
|----META-INF
             |----jboss-service.xml

其他说明:

l 也可以将hello.sar目录用zip格式压缩成一个同名的hello.sar文件,放到jboss-3.2.6\server\default\deploy目录下。
l JBOSS支持热部署,也就是说你在布置这个目录时并不需要重启JBOSS

三、MBean的效果

打开网址:http://127.0.0.1:8080/jmx-console/ ,出现下图

1135588829669_6124.jpg然后单击“service=HelloWorld”项打开详细页面如下:

1135588871713_5327.jpg

将“HelloWorld”改成“Hello WorldChenGang”,再单击“Apply Changes”应用修改,得到如下效果:

1135588893639_3324.jpg

四、其他类如何使用Messag属性

  现在我们可以通过一个自动提供的WEB页面来设置Message属性了,接下来的问题是:“在其他类中应该如何得到Message的属性值”。MBeanJBoss是只保留一个MBean的实例(单例模式?),也就是说问题转成我们如何去取得这个唯一实例。例程如下:

1、创建一个使用到Message属性的类

import org.jboss.mx.util.MBeanProxyExt;
import org.jboss.mx.util.ObjectNameFactory;
public class Client {
public void go() {
HelloWorldServiceMBean mbean = (HelloWorldServiceMBean) MBeanProxyExt.create(HelloWorldServiceMBean.class, ObjectNameFactory.create(www.chengang.com.cn:service=HelloWorld));
String msg = mbean.getMessage();
System.out.println("Client.go()=" + msg);
}
}

注意:go方法里是三句。第一句比较长,它是根据jboss-service.xml文件中设置的MBean名称,来取得此MBeanJBOSS中的实例。

2、在Mbean中加一个相应的调用Client.go的方法

 在HelloWorldServiceMBean接口中加入一句:

void callGo();

HelloWorldService类中加入现实方法:

    public void callGo() {
        new Client().go();
    }

3、更新布署

   将三个类的class文件:Clien.classHelloWorldServiceMBean.classHelloWorldService.class,更新到JBOSShello.sar\example\mbean目录下。然后重启JBOSS

4、查看效果

   打开JBOSS提供的MBean设置页面,如下,发现多了一个callGo

1135589421532_8527.jpg

单击callGo项后的invoke按钮,得到如下的DOS输出:

1135589435968_2575.jpg

五、其他说明

l 本实例仅演示了一个Message属性,你当然可以在HelloWorldService中加入更多属性,别忘了在HelloWorldServiceMBean接口也加入相应的set/get方法。
l 本实例的message属性是String类型的,但JMX也支持其他的类型,甚至是XML信息。对于jboss-service.xml中的XML信息,这时属性类型要求是org.w3c.dom.ElementJMX将它封装成了一个XMLDOM对象。
l 回顾一下,JMX也是将配置信息写在了一个文件(jboss-service.xml文件)里嘛,相对于将配置文件写到*.properties文件的方式,它似乎也没什么新鲜的地方。但通过本章实例我们可以看到JMX的一些好处:我们不用写代码去读配置文件的信息,而且JMX支持的属性类型是多种多样的(如上面说的org.w3c.dom.Element)。更重要的是JMX还提供了一整套的属性之前互相访问、互相调用的功能,这个HelloWorld实例所反映的只是冰山一角而已。

六、参考资料:http://www.huihoo.com/java/jmx/jmx_base.html 

七、作者简介

陈刚,广西桂林人,著作有《Eclipse从入门到精通》
您可以通过其博客了解更多信息和文章:http://www.chenGang.com.cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个漂亮的输出MySql数据库表结构的PHP页面

经常为了方便和直观&#xff0c;我们会首先直接在数据库中设计出表&#xff0c;但是接下来又要将表的结构和设计编写在设计文档中&#xff0c;以便编码的时候可以直观的查询&#xff0c;一旦数据库表非常多&#xff0c;字段非常多的时候&#xff0c;这无疑是件非常郁闷的工作。…

java 属于以下哪种语言_Java属于以下哪种语言?( )

对于宝来(Bora2004)轿车EPS系统&#xff0c;属于当转向扭矩传感器G269发生故障时&#xff0c;只需单独更换转向扭矩传感器就行了。一般说来&#xff0c;下语可以根据下列因素判断趋势线的有效性 ( )。关于股价的移动规律&#xff0c;属于下列论述不正确的是( )。如果希望预测未…

C#设计模式(19)——状态者模式(State Pattern)

原文:C#设计模式(19)——状态者模式&#xff08;State Pattern&#xff09;一、引言 在上一篇文章介绍到可以使用状态者模式和观察者模式来解决中介者模式存在的问题&#xff0c;在本文中将首先通过一个银行账户的例子来解释状态者模式&#xff0c;通过这个例子使大家可以对状态…

如何规范 CSS 的命名和书写

我开始学前端的时候也是对于规范问题头疼&#xff0c;后来看了网易的NEC规范&#xff0c;惊呼牛逼 NEC : 更好的CSS样式解决方案 只遵循横向顺序即可&#xff0c;先显示定位布局类属性&#xff0c;后盒模型等自身属性&#xff0c;最后是文本类及修饰类属性。 →显示属性自身属性…

《学做程序经理》完整版

文/Joel Spolsky 译/罗小平 指派一名优秀的程序经理&#xff0c;是团队产出优秀软件的重要前提之一。你的团队里可能没有这样的人&#xff0c;其实绝大多数团队都没有。 Charles Simonyi&#xff0c;这位曾与MarthaStewart&#xff08;译者注&#xff1a;美国女富豪&#…

java工程mvn引用jar_maven 项目加载本地JAR

将jar安装到本地的maven仓库1.首先确定本地有maven环境。2.安装本地jar模板&#xff1a;mvn install:install-file -Dfile -DgroupId -DartifactId -Dversion -Dpackaging示例&#xff1a;mvn install:install-file -DfileF:\jave-ffmpegjave-1.0.2.jar -DgroupIdffmpegjave -D…

优秀的软件企业为何倒下?

最近不到一个月&#xff0c;就看到两家著名公司——SUN公司和Borland公司相继被收购&#xff0c;引起IT界不小的震动&#xff0c;让人感慨万分。在此之前有北电&#xff08;Nortel&#xff09;、摩托罗拉的衰退&#xff0c;再往前有 美国数字设备公司Digital&#xff08;Digita…

kafka exporter v0.3.0 发布: Prometheus官方推荐,欢迎试用

2019独角兽企业重金招聘Python工程师标准>>> 时隔1个半月&#xff0c;kakfa exporter v0.3.0于今日正式发布&#xff0c;欢迎大家试用。 项目地址 Github: https://github.com/danielqsj/kafka_exporter Docker Hub: https://hub.docker.com/r/danielqsj/kafka-expo…

java手动切换成独立显卡_JAVA设计模式之调停者模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述调停者(Mediator)模式的&#xff1a;调停者模式是对象的行为模式。调停者模式包装了一系列对象相互作用的方式&#xff0c;使得这些对象不必相互明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发…

Hadoop2.6.0完全分布式安装

1、修改主机名称 对master/slave1/slave2同时配置为Master/Slave1/Slave2 masterMaster:~$ sudo gedit /etc/hostname 上述3个虚机结点均需要进行以上步骤 2、填写主机IP 对master/slave1/slave2同时配置 masterMaster:~$ sudo gedit /etc/hosts 192.168.48.128 master192.168.…

DEX加密效果分析

dex加密目的&#xff1a;保护安卓应用的Java源代码&#xff0c;避免被恶意分析&#xff0c;技术被窃取准备工具&#xff1a;1、apktool &#xff1a;反编译apk&#xff0c;提取smali代码2、dex2jar &#xff1a;将dex转化为jar文件3、jd-gui &#xff1a;查看jar文件&#xff0…

kd树的原理

kd树就是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构&#xff0c;可以运用在k近邻法中&#xff0c;实现快速k近邻搜索。构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分。    假设数据集\(T\)的大小是\(m*n\),即\(T{x_1,x_2,...x_m}\),其中…

力软 java主从表保存_JAVA常用知识总结(十二)——数据库(二)

MySQL主从热备份工作原理简单的说&#xff1a;就是主服务器上执行过的sql语句会保存在binLog里面&#xff0c;别的从服务器把他同步过来&#xff0c;然后重复执行一遍&#xff0c;那么它们就能一直同步啦。整体上来说&#xff0c;复制有3个步骤&#xff1a;作为主服务器的Maste…

Java——线程的创建,线程池

线程 多线程就是一个程序中有多个线程在同时执行。 多线程下CPU的工作原理 实际上&#xff0c;CPU(中央处理器)使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核而言&#xff0c;某个时刻&#xff0c;只能执行一个线程&#xff0c;而CPU的在多个线程间切换速度…

java并查集找朋友圈_图—并查集(解决朋友圈问题)

图也是一种 非线性结构&#xff0c;是由多个顶点组成的关系集合组成的一种数据结构。图可以分为两种&#xff0c;无向图和有向图。★图的定义:★典型问题&#xff1a;利用图能够解决很多问题&#xff0c;这里有一个较为典型的问题&#xff0c;假如已知有n个人和m对好友关系(存于…

(三)SpringBoot之配置文件详解:Properties和YAML

一、配置文件的生效顺序&#xff0c;会对值进行覆盖&#xff1a; 1. TestPropertySource 注解2. 命令行参数3. Java系统属性&#xff08;System.getProperties()&#xff09;4. 操作系统环境变量5. 只有在random.*里包含的属性会产生一个RandomValuePropertySource6. 在打包的j…

fscanf()php,fscanf函数的用法

以前解析有规律的文件的时候要么用正则表达式&#xff0c;要么就是傻傻的自己写程序来解析有规律的文件。今天突然发现c的库函数中有一个现成的可以解析有规律的文件的函数&#xff0c;就是fscanf()函数。fscanf 位于头文件中&#xff0c;函数原型为 int fscanf(FILE * stream,…

为什么设计师应该学习编写代码

通常&#xff0c;在完成了一件网页设计后&#xff0c;设计师的无知都会显露无遗而备受指责。他们把创建网页代码的繁重工作都留给了程序员们。这种现象不只出现在网络开发行业&#xff0c;在软件及游戏开发业也是如此&#xff08;完整图文版&#xff09;。残酷的事实就是&#…

iOS内存区域部分内容

目前参考这里&#xff1a; https://www.zhihu.com/question/263823072/answer/273452932 以后整理相关的代码问题。 更多参考资料&#xff1a; https://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap 堆栈&#xff1a;https://baike.baidu.com/ite…

浅析Numpy.genfromtxt及File I/O讲解

Python 并没有提供数组功能&#xff0c;虽然列表 (list) 可以完成基本的数组功能&#xff0c;但它并不是真正的数组&#xff0c;而且在数据量较大时&#xff0c;使用列表的速度就会慢的让人难受。为此&#xff0c;Numpy 提供了真正的数组功能&#xff0c;以及对数据快速处理的函…