关键词搜索

源码搜索 ×
×

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

发布2016-10-13浏览4469次

详情内容


欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


欢迎跳转到本文的原文链接:https://honeypps.com/java/jmx-quick-start-2-condition/

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

      修改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();
          }
      }
      
        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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

      参考资料

      1. JMX整理
      2. JMX简介
      3. http://blog.csdn.net/DryKillLogic/article/category/762777
      4. 用Apache的commons-modeler来辅助开发JMX

      欢迎跳转到本文的原文链接:https://honeypps.com/java/jmx-quick-start-2-condition/


      欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


      相关技术文章

      点击QQ咨询
      开通会员
      返回顶部
      ×
      微信扫码支付
      微信扫码支付
      确定支付下载
      请使用微信描二维码支付
      ×

      提示信息

      ×

      选择支付方式

      • 微信支付
      • 支付宝付款
      确定支付下载