博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jmx之Notification
阅读量:2444 次
发布时间:2019-05-10

本文共 4303 字,大约阅读时间需要 14 分钟。

Notification

(HtmlAdaptorServer的下载地址: )

一个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); }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
package com.test.jmx.notification;public interface XiaoSiMBean {    public void hi();}
  • 1
  • 2
  • 3
  • 4
  • 5

接下去创建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());            }        }    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

修改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(); }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

运行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

你可能感兴趣的文章
使用Screenr创建截屏视频
查看>>
互联网总线带宽_新技术将使互联网带宽翻倍
查看>>
java自由职业者是什么_一个成功的自由职业者需要什么?
查看>>
java语言作为入门好吗_Java作为学生的第一语言
查看>>
sql内联接外联接三张表_在SQL中联接三个或更多表
查看>>
Django博客教程–创建一个简单的博客
查看>>
编程和编码的区别_安全编程和编码提示
查看>>
实用的小应用_使您的新应用更安全的实用提示
查看>>
android mvp示例_Android深层链接示例
查看>>
Android RSS阅读器教程
查看>>
SkySilk –托管云服务提供商
查看>>
使用字典的Python HashMap实现
查看>>
wps宏的功能_宏与功能之间的区别
查看>>
while和do while循环之间的区别
查看>>
程序员连续剧_每个程序员都应该看的5部最佳电视连续剧
查看>>
tensorflow简介_TensorFlow简介
查看>>
矩阵 python 加法_Python矩阵加法
查看>>
python快速排序_Python快速排序
查看>>
人工神经网络导论_神经网络导论
查看>>
C ++ STL无序多集– std :: unordered_multiset
查看>>