专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
51好读  ›  专栏  ›  ImportNew

从零开始玩转 JMX ( 二 ) : Condition

ImportNew  · 公众号  · Java  · 2017-08-15 12:00

正文

请到「今天看啥」查看全文


(点击 上方公众号 ,可快速关注)


来源:朱小厮,

blog.csdn.net/u013256816/article/details/52808328

如有好文章投稿,请点击 → 这里了解详情


Notification


一个MBean提供的管理接口允许代理对其管理资源进行控制和配置。然而,对管理复杂的分布式系统来说,这些接口只是提供了一部分功能。通常,管理应用程序需要对状态变化或者当特别情况发生变化时作出反映。Notification起到了MBean之间的沟通桥梁的作用。JMX Notification模型和Java Event模型类似,将一些重要的信息,状态的转变,数据的变更传递给Notification Listener,以便资源的管理。


通知模型仅仅涉及了在同一个JMX代理中的管理构件之间的事件传播。JMX通知模型依靠以下几个部分:


  1. Notification,一个通用的事件类型,该类标识事件的类型,可以被直接使用,也可以根据传递的事件的需要而被扩展。

  2. NotificationListener接口,接受通知的对象需实现此接口。

  3. NotificationFilter接口,作为通知过滤器的对象需实现此接口,为通知监听者提供了一个过滤通知的过滤器。

  4. NotificationBroadcaster接口,通知发送者需实现此接口,该接口允许希望得到通知的监听者注册。


发送一个通用类型的通知,任何一个监听者都会得到该通知。因此,监听者需提供过滤器来选择所需要接受的通知。任何类型的MBean,标准的或动态的,都可以作为一个通知发送者,也可以作为一个通知监听者,或两者都是。


这里采用一个案例来说明,前面的Hello中有一个printHello(String whoName)方法,意思根据碰到的是谁来打招呼,比如:


小厮从对面走来,说:”hi”。我们回之以礼,说:“Hello, Xiaosi”.

首先这里需要小厮先说一个“hi”(相应一个操作方法),然后他说的话封装成了声波(Notification的消息包)传递出去。然后我们要给Hello类装上一个监听器(NotificationListener),这个监听器将捕捉到小厮的Notification消息包,然后回复说:“Hello, Xiaosi”.


引入新的类XiaoSi.Java和XiaosiMBean:


package com.test.jmx.notification;

import javax.management.Notification;

import javax.management.NotificationBroadcasterSupport;

public class XiaoSi extends NotificationBroadcasterSupport implements XiaoSiMBean {

private int seq = 0;

/*

* 必需继承NotificationBroadcasterSupport

* 此类只有一个hi方法,方法只有两句:创建一个Notification消息包,然后将包发出去

* 如果你还要在消息包上附加其他数据,Notification还有一个setUserData方法可供使用

*/

@Override

public void hi() {

Notification n = new Notification(//创建一个信息包

"xiaosi.hi",//给这个Notification起个名称

this,//由谁发出的Notification

++seq,//一系列通知中的序列号,可以设置任意数值

System.currentTimeMillis(),//发出时间

"Xiaosi"//发出信息的消息文本

);

sendNotification(n);

}

}


package com.test.jmx.notification;

public interface XiaoSiMBean {

public void hi();

}


接下去创建Hello类的Listener(HelloListener.java),用于监听Notification的消息包并处理。


package com.test.jmx.notification;

import com.test.jmx.Hello;

import javax.management.Notification;

import javax.management.NotificationListener;

public class HelloListener implements NotificationListener {

@Override

public void handleNotification(Notification notification, Object handback) {

System.out.println("----------HelloListener-Begin------------");

System.out.println("\ttype = "+ notification.getType());

System.out.println("\tsource = "+notification.getSource());

System.out.println("\tseq = "+notification.getSequenceNumber());

System.out.println("\tsend time = "+notification.getTimeStamp());

System.out.println("\tmessage="+notification.getMessage());

System.out.println("----------HelloListener-End------------");

if (handback != null) {

if (handback instanceof Hello) {

Hello hello = (Hello)handback;

hello.printHello(notification.getMessage());

}

}

}

}


修改HelloAgent的代码:


package com.test.jmx.notification;

import com.sun.jdmk.comm.HtmlAdaptorServer;

import com.test.jmx.Hello;

import javax.management.*;

import java.lang.management.ManagementFactory;

public class HelloAgent {

public static void main(String[] args) throws MalformedObjectNameException, NotCompliantMBeanException,

InstanceAlreadyExistsException, MBeanRegistrationException {

MBeanServer server = ManagementFactory.getPlatformMBeanServer();

ObjectName helloName = new ObjectName("MyMBean:name=HelloWorld");

Hello hello = new Hello();

server.registerMBean(hello,helloName);

ObjectName adapterName = new ObjectName("MyBean:name=htmladapter,port=8082");

HtmlAdaptorServer adapter = new HtmlAdaptorServer();

server.registerMBean(adapter,adapterName);

XiaoSi xs = new XiaoSi();

server.registerMBean(xs,new ObjectName("MyMBean:name=xiaosi"));

xs.addNotificationListener(new HelloListener(),null,hello);

adapter.start();

}

}


运行HelloAgent,然后在浏览器中输入localhost:8080, 点击“name=xiaosi”:



进入页面:



点击“hi”按钮,此时控制台打印:


----------HelloListener-Begin------------

type = xiaosi.hi

source = com.test.jmx.notification.XiaoSi@12f7757c

seq = 1

send time = 1476184927551

message=Xiaosi

----------HelloListener-End------------

Hello, Xiaosi


参考资料


  1. JMX整理

    http://www.open-open.com/lib/view/open1397359125465.html

  2. JMX简介

    http://blog.chinaunix.net/uid-20749563-id-718398.html

  3. http://blog.csdn.net/DryKillLogic/article/category/762777

  4. 用Apache的commons-modeler来辅助开发JMX

    http://blog.csdn.net/s464036801/article/details/9980439


系列



看完本文有收获?请转发分享给更多人

关注「ImportNew」,提升Java技能







请到「今天看啥」查看全文