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整理
  2. JMX简介
  3. http://blog.csdn.net/DryKillLogic/article/category/762777
  4. 用Apache的commons-modeler来辅助开发JMX

从零开始玩转JMX(二)——Condition的更多相关文章

  1. 从零开始玩转JMX(四)——Apache Commons Modeler & Dynamic MBean

    Apache Commons Modeler 前面的Model MBean的创建方式看上去特别复杂,一个简单功能的类ModelMBeanUtils 写了很多代码,那有木有简单点的方式呢,答案是肯定的, ...

  2. 从零开始玩转JMX(一)——简介和Standard MBean

    JMX的全称为Java Management Extensions. 顾名思义,是管理Java的一种扩展.这种机制可以方便的管理.监控正在运行中的Java程序.常用于管理线程,内存,日志Level,服 ...

  3. 从零开始玩转JMX(三)——Model MBean

    Model MBean 相对于Standard MBean,Model MBean更加灵活.如果我们不能修改已有的Java类,那么使用Model MBean是不错的选择. Model MBean也是一 ...

  4. 从零开始学Xamarin.Forms(二) 环境搭建、创建项目

    原文:从零开始学Xamarin.Forms(二) 环境搭建.创建项目 一.环境搭建 Windows下环境搭建:     1.下载并安装jdk.Android SDK和NDK,当然还需要 VS2013 ...

  5. 菜鸟玩云计算之二十:saltstack入门初步

    菜鸟玩云计算之二十 SaltStack 入门初步 0. saltstack 是什么 参考下面的文章: http://docs.saltstack.com/en/latest/topics/tutori ...

  6. windows下mongodb基础玩法系列二CURD附加一

    windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) windows下 ...

  7. windows下mongodb基础玩法系列二CURD操作(创建、更新、读取和删除)

    windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) windows下 ...

  8. 微信小程序从零开始开发步骤(二)创建小程序页面

    上一章注册完小程序,添加新建的项目,大致的准备开发已经完成,本章要分享的是 要创建一个简单的页面了,创建小程序页面的具体几个步骤: 1. 在pages 中添加一个目录 选中page,右击鼠标,从硬盘打 ...

  9. 深入浅出带你玩转sqlilabs(二)

    MYSQL高权限注入 mysql跨库注入 详情请看上一篇:深入浅出带你玩转sqlilabs(一) mysql文件操作注入-sqlilabs less7 可能用到的函数: into outfile()函 ...

随机推荐

  1. IDEA安装Python环境,并加入Anaconda环境

    为什么做这个事情? 1.首先,Anaconda中已经有各种科学计算环境,包括后面安装的tensorflow 2.通过IDEA中配置就达到了Scala.Python.Java同时运行的目的. Intel ...

  2. java面试基础题------》int Integer Integer.valueOf

    在jdk1.5的环境下,有如下4条语句: 1 2 3 4 Integer i01 = 59; int i02 = 59; Integer i03 =Integer.valueOf(59); Integ ...

  3. 修改NavigationBar的分根线颜色

    [self.navigationController.navigationBar setShadowImage:[Static ColorToImage:[Static colorWithHexStr ...

  4. andriod的apk文件相关的编译反编译工具

    1.smali-1.2.6.jar 用途:.smali文件 转成 classes.dex文件 说明:.smali文件,类似于.class文件,可以用普通文本编辑器查看和修改. 用法举例:命令行:jav ...

  5. 并发编程 - 进程 - 1.队列的使用/2.生产者消费者模型/3.JoinableQueue

    1.队列的使用: 队列引用的前提: 多个进程对同一块共享数据的修改:要从硬盘读文件,慢,还要考虑上锁: 所以就出现了 队列 和 管道 都在内存中(快): 队列 = 管道 + 上锁 用队列的目的: 进程 ...

  6. 网络爬虫值scrapy框架基础

    简介 Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv.json等文件中. 首先我们安装Scrapy. 其可以应用在数据挖掘,信息处理或存储历史 ...

  7. python和shell之间变量的相互调用

    python -> shell: 1.环境变量 2.字符串连接 3.通过管道 import os var=’123’ os.popen(’wc -c’, ’w’).write(var) 4.通过 ...

  8. 永远也记不住的linux环境变量,库文件,头文件,交叉编译...

    一.环境变量1.node-v4.9.1-linux-armv7l1)安装cp node-v4.9.1-linux-armv7l.tar.gz /usr/local/cd /usr/local/tar ...

  9. 脚本其实很简单-windows配置核查程序(1)

    先上成品图 需求描述 我们电脑上都安装各种过监控软件,比如360.鲁大师等等...其中有一个功能就是性能监控,在安全行业里面通常叫做"配置核查",目的就是将主机的各种性能指标展示, ...

  10. python将图片转化为字符图

    最近看到将图片转化为字符图的小实验,我觉得很有趣,所以决定自己实现一下. 步骤和原理如下: 读取图片的灰度值矩阵(0-255之间),灰度值矩阵主要反映的是图片的黑白程度,越黑越接近与0,越白越接近于2 ...