`
canofy
  • 浏览: 829700 次
  • 性别: Icon_minigender_1
  • 来自: 北京、四川
社区版块
存档分类
最新评论

JMX的一个链接类

    博客分类:
  • j2EE
阅读更多
package com.pachira.oamp.jmxServer;

import java.util.HashMap;
import java.util.Map;
import javax.management.JMX;
import javax.management.MBeanServer;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerFactory;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import org.apache.cxf.common.util.StringUtils;
import com.pachira.oamp.utils.ConfigUtils;
import com.pachira.utils.SrvLogger;

public class ClientMBServerManage {
	private static MBeanServer server=null;
	private static ClientMBServerManage instance=null;
	private static MBeanServerConnection mbsc=null;

	private ClientMBServerManage(){
		server=getLocalMBServer();
		mbsc=this.getRemoteMBConn();
	}

	public static ClientMBServerManage getInstance(){
		if(instance==null){
			 synchronized (ClientMBServerManage.class) {
		          if (instance == null) {
		        	  instance = new ClientMBServerManage();
		          }
             }
		}
		return instance;
	}

	/**
	 * 注册MBean
	 * @param obj
	 * @param className
	 * @param name
	 */
	public void register(Object obj,String className,String name){
		try {
			ObjectName objectName = getObjectName(name);
			this.registerLocal(obj, objectName);
			this.registerRemote(className, objectName);
		} catch(Exception e) {
			SrvLogger.error("oamp", ClientMBServerManage.class, "Fail to register MBean", e);
		}
	}

	/**
	 * 根据名称注销远程的MBean
	 *
	 * @param name
	 */
	public void unRegisterRemote(String name){
		try {
			if(mbsc==null){
				return ;
			}
			if(StringUtils.isEmpty(name)){
				name="*";
			}
			ObjectName objectName =getObjectName(name);
			 for (ObjectInstance object : mbsc.queryMBeans(objectName, null)) {//服务器上的所有MBean
				 ObjectName on=object.getObjectName();
				 if(mbsc.isRegistered(on)){
					mbsc.unregisterMBean(on);
				 }
			 }
		} catch(Exception e) {
			SrvLogger.error("oamp", ClientMBServerManage.class, "Fail to register MBean", e);
		}
	}

	/**
	 * 获取远程的对象
	 * @param name
	 * @param cla
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public Object getRemoteMBean(String name,Class cla){
		 ObjectName objectName = getObjectName(name);
		 try {
			if(mbsc!=null&&objectName!=null&&mbsc.isRegistered(objectName)){
				return JMX.newMBeanProxy(mbsc, objectName,cla);
			 }
		} catch (Exception e) {
			SrvLogger.error("oamp", ClientMBServerManage.class, "Fail to getRemoteMBean", e);
		}
		return null;
	}

	/**
	 * 执行远程方法
	 * @param name
	 * @param operationName
	 * @param params
	 * @param signature
	 */
	public void invokeRemote(String name,String operationName,Object[] params,String[] signature){
		try {
			if(mbsc==null){
				return ;
			}
			ObjectName objectName=this.getObjectName(name);
			if(StringUtils.isEmpty(name)||StringUtils.isEmpty(operationName)||objectName==null){
				return ;
			}
			mbsc.invoke(objectName, operationName, params, signature);
		} catch (Exception e) {
			SrvLogger.error("oamp", ClientMBServerManage.class, "Fail to invokeRemote", e);
		}
	}

	/**
	 * 本地注册MBean,没有则创建
	 * @param obj
	 * @param objectName
	 */
	private void registerLocal(Object obj,ObjectName objectName){
		if(obj==null||objectName==null){
			return ;
		}
		try {
			if(!server.isRegistered(objectName)){
				server.registerMBean(obj, objectName);
			}
		} catch(Exception e) {
			SrvLogger.error("oamp", ClientMBServerManage.class, "Fail to register MBean", e);
		}
	}

	/**
	 * 根据name获取ObjectName
	 * @param name
	 * @return
	 */
	private ObjectName getObjectName(String name){
		if(StringUtils.isEmpty(name)){
			return null;
		}
		String ip=ConfigUtils.getInstance().getOampConfig("IP");
		ObjectName objectName=null;
		try {
			objectName = new ObjectName("QianYu:type=oamp,name=" +ip+name);
		} catch (Exception e) {
			SrvLogger.error("oamp", ClientMBServerManage.class, "Fail to get ObjectName", e);
		}
		return objectName;
	}

	/**
	 * 远程注册MBean,没有则创建
	 * @param className
	 * @param objectName
	 */
	private void registerRemote(String className,ObjectName objectName){
		if(StringUtils.isEmpty(className)||objectName==null||mbsc==null){
			return ;
		}
		try {
			if(!mbsc.isRegistered(objectName)){
				mbsc.createMBean(className, objectName,null,null);
			}
		} catch(Exception e) {
//			e.printStackTrace();
			SrvLogger.error("oamp", ClientMBServerManage.class, "Fail to register MBean", e);
		}
	}


	/**
	 * 获取本地MBeanServer
	 * @return
	 */
	private MBeanServer getLocalMBServer(){
		MBeanServer mBeanServer = null;
		if (MBeanServerFactory.findMBeanServer(null).size() > 0) {
			mBeanServer =(MBeanServer) MBeanServerFactory.findMBeanServer(null).get(0);
		} else {
			mBeanServer = MBeanServerFactory.createMBeanServer();
		}
		return mBeanServer;
	}

	/**
	 * 获取远程MBeanServerConnection
	 * @return
	 */
	private MBeanServerConnection getRemoteMBConn(){
		// provide a valid username and password (e.g., via program arguments)
	    String user = "monitorRole";
	    String pw = "password";
	    // place the username and password in a string array of credentials that
	    // can be used when making the connection to the remote JMX agent
	    String[] credentials = new String[] { user, pw };
	    // the string array of credentials is placed in a map keyed against the
	    // well-defined credentials identifier string
	    Map<String, String[]> props = new HashMap<String, String[]>();
	    props.put("jmx.remote.credentials", credentials);
	    // supply the map of credentials to the connect call
	    JMXServiceURL address;
	    MBeanServerConnection mbs=null;
		try {
			address = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1234/jmxrmi");
			JMXConnector connector = JMXConnectorFactory.connect(address, props);
			mbs= connector.getMBeanServerConnection();
		    connector.connect();
		} catch (Exception e) {
			SrvLogger.error("oamp", ClientMBServerManage.class, "Fail to getRemoteMBConn", e);
		}

	    return mbs;
	}
}

分享到:
评论

相关推荐

    JBoss JMX实现架构

    类加载的过程遵循委派模型,每个类加载器实例都有一个父类加载器。当需要加载类时,先由父类加载器尝试,如果找不到则递归到更高级别的父类加载器,直到到达根类加载器(Bootstrap ClassLoader)。这种机制确保了...

    JMX、MXBean学习

    MXBean是JMX中的一个特殊概念,它是标准MBean的扩展,旨在简化跨JVM边界传递数据的过程。MXBean接口定义了特定的命名规则和序列化机制,确保数据能够在不同的Java环境中安全地传输。MXBean的使用通常涉及到JConsole...

    JMX入门的好资料啊

    这篇博客文章(可以通过给定的链接访问)可能是介绍JMX基础知识的一个很好的起点。虽然具体的博客内容未在描述中给出,但我们可以根据JMX的一般知识来探讨其关键概念和用法。 首先,JMX的核心组成部分包括MBeans...

    jmx需要的jar包

    Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、操作系统和网络设备。它提供了一种统一的方式来创建、配置、查询和控制管理对象,使得开发者可以轻松地将管理功能集成到...

    jmx_examples.zip_jmx_examples

    Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、系统和服务。在"jmx_examples.zip_jmx_examples"这个压缩包中,我们可能会找到一系列示例代码,这些代码展示了如何利用JMX...

    JMX exporter.zip

    原文链接:https://blog.csdn.net/m0_37814112/article/details/118852474?spm=1001.2014.3001.5501 说明:包括jmx_prometheus_javaagent-0.16.1.jar和prometheus-jmx-config.yaml

    7.Coherence企业级缓存(六) JMX 管理和监控.pdf

    此时,JMX作为一种标准的Java平台管理系统接口,提供了统一的管理视图,使得管理员能够实时监控和调整Coherence集群的状态,从而实现性能优化和故障排查。 #### 启用JMX管理的配置 为了在Coherence集群中启用JMX...

    jmx1.4规范.pdf

    JMX (Java Management Extensions) 技术作为 Java 平台上的一个重要组成部分,主要用于监控和管理系统资源。随着 Java 的广泛应用,JMX 已经成为 JDK 标准的一部分,并且在 1.4 版本中得到了进一步的增强和发展。...

    jmx-agent:jmx-agent 使用 JVM Agent 接口链接到任何 JVM,并导出 JMX Server!

    jmx-agent 使用 JVM Agent 接口链接到任何 JVM,并导出 JMX Server! 安装 通过在启动 Java 进程时提供单个启动选项 -javaagent 来安装此代理。 java -javaagent:JmxAgent.jar=port=5678,host=localhost JmxAgent...

    使用jmx监控service接口

    NULL 博文链接:https://jonerxq.iteye.com/blog/1990872

    java JMX概述

    Java Management Extensions(JMX)是Java平台上的一个标准组件,用于构建和管理应用程序、设备和服务的管理系统。JMX提供了一种灵活的框架,允许开发者创建、注册和管理名为Managed Beans(MBeans)的对象,这些...

    JMX1.4规范中文版.pdf

    JMX(Java Management Extensions)技术是Java平台上的一个重要组成部分,用于管理和监控Java应用程序及运行环境。随着JMX技术的发展,其最新版本1.4已经成为JDK标准的一部分。这一规范的发布对于Java开发者来说具有...

    JMX简介

    NULL 博文链接:https://hotboy10001000.iteye.com/blog/865118

    jmx_tristan_notification

    标题“jmx_tristan_notification”涉及的是Java管理扩展(Java Management Extensions, JMX)技术,一个用于管理和监控Java应用程序的框架。在这个特定的上下文中,它可能与博主Tristan分享的一篇博客文章有关,该...

    JMX(二)----connectors

    NULL 博文链接:https://90haofang-163-com.iteye.com/blog/1902211

    谷歌浏览器使用blazemeter插件录制jmx脚本

    "谷歌浏览器使用blazemeter插件录制jmx脚本" 本文将详细介绍如何使用谷歌浏览器中的blazemeter插件录制jmx脚本,包括插件的下载和安装、录制jmx脚本的步骤,以及jmx脚本的导出和使用。 首先,需要下载blazemeter...

    jmx例子一则

    博文链接:https://aga.iteye.com/blog/209568

    JMX HtmlAdapter

    博文链接:https://hintcnuie.iteye.com/blog/244247

    免费下载 jmxtools-1.2.1.jar + jmxri-1.2.1.jar.zip

    在Maven项目中,`log4j`是一个广泛使用的日志记录框架,它提供灵活的日志配置和多种输出格式。当集成log4j时,有时需要配置MBeans来监控日志级别、日志输出等信息,这就需要用到JMX。因此,`log4j`的配置可能会依赖...

Global site tag (gtag.js) - Google Analytics