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
/*
* Created on 2004-12-27
* @author roson
*/
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
/*
* Created on 2004-12-27
* @author roson
*/
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
然后找到Mbean 的属性
List of MBean attributes:
更改Value值,按 Apply ,搞定(如果下一个页面显示成功)。看下Console输出什么呢。
顺便说下 Access的值 有三个 RW (Read Write) ,RO(ReadOnly) ,WO(WriteOnly)
参考 :http://www.huihoo.com/java/jmx/jmx2.html 和 jmxremote-1_0_1-bin/doc/