天天看点

JMX Notification JMX Notification 收藏

JMX Notification 收藏

<script type="text/javascript"> document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() { var text = clipboardData.getData("text"); if (text && text.length>300) { text = text + "/r/n/n本文来自CSDN博客,转载请标明出处:" + location.href; clipboardData.setData("text", text); } }, 100); } } </script> <script type="text/javascript">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

Mbean 之间的通信是必不可少, Notification 就起到了 Mbean 之间沟通桥梁的作用。 JMX notification model 和 java event model 类似,将一些重要的信息,状态的转变,数据的变更传递给 notification listener 。以使资源更容易管理。

JMX notification 由四部分组成:

1、  Notification

2、  Notification broadcaster

3、  Notification listerner

4、  Notification filter

通过简单的 HelloWorld 例子来说明 Notification 的实现过程吧。

HelloWorldMBean.java

package notification;

public interface HelloWorldMBean {

    public void setGreeting(String greeting);

    public String getGreeting();

    public void printGreeting();

}

HelloWorld.java

package notification;

import java.io.*;

import javax.management.*;

public class HelloWorld extends NotificationBroadcasterSupport

                                          implements HelloWorldMBean

{

    private String greeting;

    public HelloWorld()

    {

        this.greeting = "Hello World! I am a Standard MBean";

    }

    public HelloWorld( String greeting )

    {

        this.greeting = greeting;

    }

    public void setGreeting( String greeting )

    {   // 更改属性这里增加了 notification 只要更改属性就可以看到。

         this.greeting = greeting;

        Notification notification = new Notification(

                "jmxbook.ch2.helloWorld.test" ,

                this,                                      -1,

                System.currentTimeMillis(),        

                greeting);

        sendNotification( notification );

    }

    public String getGreeting()

    {

        return greeting;

    }

    public void printGreeting()

    {

        System.out.println( greeting );

    }

}

Notification 的结构体一开始是觉的比较麻烦的,不知道各个参数代表什么意思。可以看下 sun 提供的关于 jmx 的 api , 这里看下 notification 的结构体

1、 

Notification

(

String

 type,

Object

 source, long sequenceNumber)

2、 

Notification

(

String

 type,

Object

 source,long sequenceNumber,l

ong timeStamp)

3、 

Notification

(

String

 type,

Object

 source,long sequenceNumber,long timeStamp,

String

 message)

4、

Notification

(

String

 type,

Object

 source,long sequenceNumber,

String

 message)

type 用来标示通知, source 为产生通知的 MBean , sequenceNumber 为一系列通知中的序号, timeStamp 为通知创建的时间, message 为具体的通知消息。

HelloAgent.java

package notification;

import javax.management.*;

import com.sun.jdmk.comm.HtmlAdaptorServer;

public class HelloAgent implements NotificationListener

{

    private MBeanServer mbs = null;

    public HelloAgent ( )

    {

        mbs = MBeanServerFactory.createMBeanServer("HelloWorld Server");

        HtmlAdaptorServer adapter = new HtmlAdaptorServer();

        HelloWorld hw = new HelloWorld();

        ObjectName adapterName = null;

        ObjectName helloWorldName = null;

        try

        {

            adapter.setPort(9092);   //8082 是默认的端口可以不设

            adapterName = new ObjectName("HelloAgent:name=htmladapter,port=9092" );

            mbs.registerMBean(adapter,adapterName );

            helloWorldName = new ObjectName("HelloAgent:name=helloWorld1" );

            mbs.registerMBean( hw, helloWorldName );

            hw.addNotificationListener( this, null, null );

        }

        catch( Exception e )

        {

            e.printStackTrace();

        }

        adapter.start();

    }//constructor

    public void handleNotification(Notification notif, Object handback )

{

       // 可以在这里顺便看下 notification 结构体的参数。

        System.out.println( "Receiving notification..." );

        System.out.println( notif.getType());

         System.out.println(notif.getSource());

        System.out.println( notif.getMessage());

    }

    public static void main( String args[] )

    {

        System.out.println("Start agent");

        HelloAgent agent = new HelloAgent();

    }

}

好了可以运行了,打开浏览器 输入 http://localhost:9092 然后在注册 Mbean 的地方找到

List of registered MBeans by domain:

  • HelloAgent
    • name=helloWorld1      // 就是这里了。当然不是这里点击噢(浏览器上)
    • name=htmladapter,port=9092
  • JMImplementation
    • type=MBeanServerDelegate

然后找到 Mbean 的属性

List of MBean attributes:

Name Type Access Value
Greeting java.lang.String RW

更改 Value 值,按 Apply ,搞定(如果下一个页面显示成功)。看下 Console 输出什么呢。

顺便说下 Access的值 有三个 RW (Read Write) ,RO(ReadOnly) ,WO(WriteOnly)