欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

Notificati 图纸加密 onListener接口

点击: 次  来源:宝鼎软件 时间:2017-08-09

原文出处: 朱小厮

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();
    }
}