`
blackbeans
  • 浏览: 141642 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JMX的简单回顾

阅读更多

之前有了解过JMX,工作中有时候也在用,但是啥东西不系统的学一下,你的内心是空虚的,因此这两天整了整。就放些代码吧,和JMX规范的架构图把。

 

JMX 架构图:

JMX架构图

 

 

package com.blackbeans.example.mbeans;

/**
 * Mbean接口
 * @author blackbeans
 *
 */
public interface GunMBean {
	
	public void aimAndShoot(String[] targetName);
}

 

 

package com.blackbeans.example.mbeans;
import javax.management.AttributeChangeNotification;
import javax.management.NotificationBroadcasterSupport;

/**
 * 实现的Mbean,即所谓的JMX Resources
 * 
 * @author blackbeans
 * 
 */
public class Gun extends NotificationBroadcasterSupport implements GunMBean {

	private String gunModel;

	public Gun(String gunModel) {
		this.gunModel = gunModel;
	}

	@Override
	public void aimAndShoot(String[] targetNames){
		
		for(String targetName : targetNames ){
		System.out.println(gunModel + "aim at "+ targetName +" !");
		
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		System.out.println(gunModel + " fire !");
		}
		
		AttributeChangeNotification notification = new AttributeChangeNotification(this, 0, 0L, "Gun shot!", null, null, null, null);

		sendNotification(notification);
		
	}
}

   为了监控MBean的值变,JMX 的Agent Level有提供基于java 事件的Notification机制可以通知其他的JMX当前的资源发生了变更。JMX 的Agent Level提供了Monitor服务并通知所有的Listener。

 

 

package com.blackbeans.example.mbeans;

import javax.management.Notification;
import javax.management.NotificationListener;

public class GunFiredNotificationListener implements NotificationListener {

	@Override
	public void handleNotification(Notification notification, Object handback) {
		System.out.println("notifyInfo:\t"+notification+"\n handback:\t"+handback);

	}

}

 

   MBServer

 

package com.blackbeans.example.mbeans;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.net.MalformedURLException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;

public class MyMBeanServer {
	
	private MBeanServer mbServer;
	
	public MyMBeanServer()
	{
		this.mbServer = ManagementFactory.getPlatformMBeanServer();
		try {
			Registry reg = LocateRegistry.createRegistry(9999);
			for(String bind : reg.list()){
				System.out.println(bind);
			}
			JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://192.168.1.101:9999/MBServer");
			JMXConnectorServer connector = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbServer);
			connector.start();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	
	public void registerMBean(String objectName,Object obj)
	{
		ObjectName objName = null;
		try {
			objName = new ObjectName(objectName);
			this.mbServer.registerMBean(obj, objName);
			this.mbServer.addNotificationListener(objName, new GunFiredNotificationListener(), null, null);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	public static void main(String[] args) throws InterruptedException {
		Gun gun = new Gun("AK-47");
		MyMBeanServer myServer = new MyMBeanServer();
		myServer.registerMBean(gun.getClass().getPackage().getName() + ":name="+gun.getClass().getSimpleName(), gun);
		Thread.sleep(100000);
	}
}

   MBeanClient

 

package com.blackbeans.example.mbeans;
import java.io.IOException;
import java.net.MalformedURLException;

import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;


public class MyMBeanClient{
	
	
	private MBeanServerConnection connection;
	public MyMBeanClient(String jmxUrl)
	{
		JMXServiceURL url = null;
		try {
			url = new JMXServiceURL(jmxUrl);
			JMXConnector connector = JMXConnectorFactory.connect(url);
			connector.connect();
			 this.connection = connector.getMBeanServerConnection();
			
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	public void invokeMethod(ObjectName objName,String opName ,Object[] paras,String[] signature)
	{
		
		
		try {
			this.connection.invoke(objName, opName, paras, signature);
			
		} catch (InstanceNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MBeanException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ReflectionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
			 
		String[] gunTypes = new String[]{"AK-47","M16"}; 
		
		MyMBeanClient client = new MyMBeanClient("service:jmx:rmi:///jndi/rmi://192.168.1.101:9999/MBServer");
		
		try {
			ObjectName objName = new ObjectName("com.blackbeans.example.mbeans:name=Gun");
			Object[] parameters = new Object[]{gunTypes};
			String[] signatures = new String[]{"[Ljava.lang.String;"};
			client.invokeMethod(objName, "aimAndShoot", parameters, signatures);
			
		} catch (MalformedObjectNameException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NullPointerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

 

   我的例子使用的JMX的RMI方式调用,当然你也可以选择使用本地方式或者使用Sun的 HtmlJmxAdapter 来完成JMX调用或者不用客户端直接使用jconsol连接上去调用即可.

 

reference:

                http://java.sun.com/developer/technicalArticles/J2SE/jmx.html

分享到:
评论

相关推荐

    JMX IN ACTION(四)

    回顾第二章,你使用HTML适配器动态加载了HelloWorld MBean到简单的JMX代理。为了使代理能够成功使用反射创建MBean,你使用的类名必须对应于一个具体类。 2. MBean必须有一个公共构造函数。除了必须公开之外,构造...

    JMX IN ACTION(二)

    在深入学习之前,我们先回顾一下JMX的架构,并创建一个开发环境。 **2.1.1 JMX架构简述** JMX架构由三个主要部分或层组成,共同提供Java管理解决方案。这三个层次如表2.1所示: **表2.1 JMX组件的三个层次** 1. ...

    JMX IN ACTION(十四)

    通过集成JMX,开发者可以为EJB应用提供分布式、简单的信息收集、行为调整和监控机制。 14.1 EJB回顾 在深入了解EJB与JMX的结合之前,我们需要回顾一下EJB的基本概念。EJB模型定义了一种创建EJB的标准方式,使得它们...

    tomcat 实时监控工具

    在了解Lambda Probe之前,我们先来简单回顾一下Tomcat。Tomcat是Apache软件基金会的Jakarta项目下的一个开源Java Servlet容器,主要用于运行Java Web应用程序,包括JSP和Servlet。 Lambda Probe以其易用性和丰富的...

    hibernate3.5.4全中文帮助文档

    **1.4 总结**:回顾教程中学到的关键概念和技术点。 #### 二、体系结构 - **概况**:概述Hibernate的总体架构,包括核心组件及其职责。 - **实例状态**:介绍Hibernate中的对象状态,如瞬时状态、持久状态等。 - *...

    tomcat5.0jar

    5. **JMX(Java Management Extensions)**:5.0版本中,Tomcat集成了JMX,允许管理员监控和管理服务器的运行状态。 三、Tomcat5.0的应用实践 在实际开发中,Tomcat5.0有以下关键应用场景: 1. **小型Web应用**:...

    hibernate 帮助文档

    - **学习成果**:回顾本章节所学的主要概念和技术。 - **实践建议**:提供进一步的学习资源和实践建议。 #### 二、体系结构(Architecture) **2.1 概况(Overview)** - **整体架构**:概述Hibernate的体系结构...

    hibernate 中文参考手册

    - **回顾要点**:总结本章学习的主要内容。 - **后续章节预告**:为接下来的学习内容做好铺垫。 #### 二、架构篇 ##### 2.1 概览 **2.1.1 最小架构** - **核心组件**:介绍最小架构中涉及的核心组件。 - **架构...

    Hibernate手册

    - **JMX整合**:描述如何通过JMX监控和管理Hibernate运行时的行为。 - **对JCA的支持**:解释Hibernate如何集成企业级的资源适配器。 - **上下文相关的会话**:介绍如何在Web应用中管理会话的上下文。 #### 配置 -...

    Hibernate Reference Documentation

    - **要点回顾**:总结本章学习的重点,帮助读者巩固所学知识。 #### 二、架构 **2.1 概览** - **架构组件**:介绍Hibernate框架的主要组成部分,包括SessionFactory、Session、Transaction等核心概念。 - **工作...

    java_JDK6_code.rar_javajdk6

    9. **增强的JMX(Java Management Extensions)**:使远程管理和监控Java应用程序变得更加简单。 在"java学习笔记JDK6课件和课本代码"中,可能包含了对这些特性的详细解释,以及如何在实际项目中应用它们的示例。...

    Hbase+Spring boot实战分布式文件存储

    第1章 课程简介 课程简介及期望学习本门课程... 14-1 SDK模块HosClient类开发 14-2 SDK模块HosClient功能开发 14-3 SDK模块测试 第15章 课程总结 对整个课程的所用到的理论,技术做一个简单的回顾总结,提出优化的空间

    Hibernate 3.x 参考手册

    - **回顾核心概念** - POJO、映射文件、SessionFactory、Session、Transaction。 - 关联关系的映射和管理。 #### 三、架构概述 **3.1 概览** - **主要组件:** - `SessionFactory`:负责创建 `Session`。 - `...

Global site tag (gtag.js) - Google Analytics