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

通过Jmx访问MBean的两种方式:本机和远程

阅读更多
通过Jmx访问MBean的两种方式:本机和远程,代码示例如下:

//////////////////////////////////////begin/////////////////////////////////////////////////////

public class JmxInvocationClient {

private static String queueName = "CND_00_21_CC_C3_06_20_";
private String strHostAndPortOfJmxUrl = "localhost:1099";
private String strJmxUrl = null;
private String strMbeanName = null;
private static boolean enableDebug = false;
private static String strJmxUrlFromSystem = null;
private static final String LOCAL_BROKER_NAME = "LOCAL_BROKER_NAME";
private static final String LOCAL_JMX_URL = "LOCAL_JMX_URL";
private static String jmxUser;
private static String jmxPassword;
private JMXServiceURL jmxServiceUrl;
private boolean jmxUseLocal = false;
private JMXConnector jmxConnector;
private MBeanServerConnection jmxConnection;

public static Log logger = LogFactory.getLog(JmxInvocationClient.class);

static {
  enableDebug = Boolean.parseBoolean(System.getProperty("IS_DEBUG"));
  strJmxUrlFromSystem = System.getProperty(LOCAL_JMX_URL);
  queueName = queueName + System.getProperty(LOCAL_BROKER_NAME);
  jmxUser = System.getProperty("emq.jmx.user");
  jmxPassword = System.getProperty("emq.jmx.password");
}

public JmxInvocationClient() {
}

public JmxInvocationClient(final String paramHostAndPortOfJmxUrl) {
  this.strHostAndPortOfJmxUrl = paramHostAndPortOfJmxUrl;
}

private void initParam() {
  // 构造jmx url
  StringBuffer sb = new StringBuffer(512);
  sb.append("service:jmx:rmi:///jndi/rmi://");
  sb.append(strHostAndPortOfJmxUrl);
  sb.append("/jmxrmi");

  this.strJmxUrl = sb.toString();
  sb = null;

  // 构造mbean的过滤名称
  StringBuffer sbForMbean = new StringBuffer(512);
  sbForMbean.append(",Type=Queue,Destination=");
  sbForMbean.append(queueName);

  this.strMbeanName = sbForMbean.toString();
  sbForMbean = null;
}

private void initConn(final String paramJmxUrl) {
  try {
   this.jmxServiceUrl = new JMXServiceURL(paramJmxUrl);
  } catch (MalformedURLException mue) {
   mue.printStackTrace();
  }
}

/**
  * @return JMX service url
  */
private JMXServiceURL getJmxServiceUrl() {
  return jmxServiceUrl;
}

/**
  * Create a JMX connector
  *
  * @return created JMX connector
  * @throws IOException
  */
private JMXConnector createJmxConnector() throws IOException {
  // Reuse the previous connection
  if (jmxConnector != null) {
   jmxConnector.connect();
   return jmxConnector;
  }

  // Create a new JMX connector
  // Decide whether need security authentication or not
  if (jmxUser != null && jmxPassword != null) {
   Map<String, Object> props = new HashMap<String, Object>();
   props.put(JMXConnector.CREDENTIALS, new String[] { jmxUser,
     jmxPassword });
   jmxConnector = JMXConnectorFactory.connect(this.getJmxServiceUrl(),
     props);
  } else {
   jmxConnector = JMXConnectorFactory.connect(this.getJmxServiceUrl());
  }
  return jmxConnector;
}

/**
  * Close the current JMX connector
  */
private void closeJmxConnection() {
  try {
   if (jmxConnector != null) {
    jmxConnector.close();
    jmxConnector = null;
   }
  } catch (IOException e) {
   logger.error("An exception occurs when closing the JMX connector:");
   e.printStackTrace();
  }
}

/**
  * Create a JMX connection
  */
private MBeanServerConnection createJmxConnection() throws IOException {
  if (jmxConnection == null) {
   if (isJmxUseLocal()) {
    jmxConnection = ManagementFactory.getPlatformMBeanServer();
   } else {
    jmxConnection = createJmxConnector().getMBeanServerConnection();
   }
  }
  return jmxConnection;
}

/**
  * @param paramMsgId
  *            message id
  * @return 0:no operate;1:success;2:failure;3:error;
  */
public int deleteMsgFromQueue(final String paramMsgId,
   final boolean isJmxFromSystem) {

  int flag = 0;

  if (paramMsgId == null || paramMsgId.trim().length() == 0) {
   return flag;
  }

  this.initParam();
  this.initConn(isJmxFromSystem ? strJmxUrlFromSystem : this.strJmxUrl);
  try {
   this.createJmxConnection();
   // 1.动态获取mbean的objectname
   String strObjectName = "";

   Iterator iter = this.jmxConnection.queryMBeans(null, null)
     .iterator();
   for (; iter != null && iter.hasNext();) {
    ObjectInstance oi = (ObjectInstance) iter.next();
    if (enableDebug) {
     System.out.println("=Mbean ObjectName is:="
       + oi.getObjectName() + "=end=");
    }
    if (oi.getObjectName() != null
      && oi.getObjectName().toString().indexOf(
        this.strMbeanName) >= 0) {
     strObjectName = oi.getObjectName().toString();
     break;
    }
   }

   // 2.构造mbean对象
   ObjectName mbeanName = new ObjectName(strObjectName);

   // 3.得到proxy代理后直接调用的方式
   QueueViewMBean proxy = (QueueViewMBean) MBeanServerInvocationHandler
     .newProxyInstance(this.jmxConnection, mbeanName,
       QueueViewMBean.class, false);

   try {
    if (proxy.removeMessage(paramMsgId)) {
     flag = 1;
    } else {
     flag = 2;
    }
   } catch (Exception e) {
    flag = 3;
    // e.printStackTrace();
   }

  } catch (MalformedURLException mue) {
   mue.printStackTrace();
  } catch (IOException ioe) {
   ioe.printStackTrace();
  } catch (MalformedObjectNameException mone) {
   mone.printStackTrace();
  }
  this.closeJmxConnection();
  return flag;
}

public static void main(String[] args) {

  JmxInvocationClient test = new JmxInvocationClient();
  if (false) {
   String strMsgId = "111";
   int result = test.deleteMsgFromQueue(strMsgId, false);
   System.out.println("=result is:=" + result + "=end=");
  }

}

public boolean isJmxUseLocal() {
  return jmxUseLocal;
}

public void setJmxUseLocal(boolean jmxUseLocal) {
  this.jmxUseLocal = jmxUseLocal;
}

}

//////////////////////////////////////end/////////////////////////////////////////////////////
分享到:
评论

相关推荐

    Java分布式应用学习笔记09JMX-MBean的介绍

    MBean主要分为两种类型:Standard MBean和Dynamic MBean。 ##### Standard MBean Standard MBean是最常见的MBean类型,它要求实现特定的接口,并遵循一定的命名约定。通常情况下,开发者只需要编写一个普通的...

    JMX实用例子详解(包括各种Mbean)

    5. **使用JConsole或VisualVM**:这两个内置的JMX客户端工具的使用方法,包括连接到远程MBean Server、查看和修改MBean属性、接收和处理通知。 6. **编写自定义管理工具**:介绍如何使用JMX API创建自己的管理工具...

    使用RMI远程连接JVM.用JMX获取JVM的参数

    在Java世界中,远程方法调用(Remote Method Invocation, RMI)和Java管理扩展(Java Management Extensions, JMX)是两个强大的工具,用于管理和监控分布式系统。本文将深入探讨如何利用RMI远程连接到Java虚拟机...

    jmxtools.jar jmxri.jar

    它提供了一种灵活的框架,允许开发者创建、注册和管理管理对象(MBeans),这些对象代表了系统中的可管理资源,并且可以通过JMX API进行访问和操作。 `jmxtools.jar` 和 `jmxri.jar` 是JMX技术中两个重要的库文件,...

    基于JMX的IT系统管理关键技术研究与实现

    创建MBean的方法有多种,主要包括动态注册MBean和静态注册MBean两种方式。动态注册是指在运行时通过代码动态地向MBean服务器注册一个MBean;而静态注册则是在启动时通过配置文件预先定义好的MBean。 ##### 3.2 ...

    jmx-1.2.1(jmxri+jmxtools) jar

    Java Management Extensions(JMX)是Java平台上的一个标准,它提供了一种管理和监控应用程序、操作系统、网络设备和其他Java应用程序的方式。这个"jmx-1.2.1(jmxri+jmxtools) jar"包含了JMX的两个核心组件:JMX ...

    JMX与Spring 结合

    **JMX(Java Management Extensions)** 是Java平台提供的一种管理和监控的标准框架,它允许开发者对应用程序、设备和服务进行管理,提供了动态发现、监控和管理的能力。JMX 可以帮助我们远程控制应用,查看其运行...

    jmxri.jar包

    - 连接和交互:通过JMX连接器,客户端可以连接到MBean服务器,并通过查询、调用操作或设置属性来管理MBean。 在实际应用中,JMX广泛应用于服务器管理工具、应用服务器、数据库管理系统以及其他需要远程监控和管理的...

    jmx相关jar包

    它提供了一种统一的方式来创建、配置、查询和控制管理资源,使得开发者能够轻松地在他们的应用中添加管理功能。 `jmxri.jar` 和 `jmxremote.jar` 是与JMX相关的两个关键库文件: 1. **jmxri.jar**:这个库文件包含...

    jmx osgi 实例

    在IT领域,JMX(Java Management Extensions)和OSGi(Open Service Gateway Initiative)是两种重要的技术,它们分别用于管理和模块化Java应用程序。本实例将两者结合,展示了如何将OSGi的bundle注册到JMX以便进行...

    jmx所需的jar

    在这个场景中,提到的两个jar文件——`jmx_remote-1_0_1_03-ri.zip`和`jmx-1_2_1-ri.zip`,都是与JMX相关的库,用于支持远程管理和监控。 1. `jmx-1_2_1-ri.zip`: 这个文件包含了JMX 1.2.1版本的Runtime ...

    JMX入门教程

    通过JMX,开发者可以轻松地在Java应用程序中集成管理和监控的功能,从而实现对应用程序状态和服务的远程管理。 在深入探讨JMX的具体用法之前,我们首先来了解它能够带来的实际益处: 1. **动态配置**:JMX允许应用...

    jmx一步步来 jmx快速上手指南

    通过上述示例可以看出,JMX通过定义MBean接口和其实现类的方式,使得我们能够通过标准的方法来管理和监控应用程序。这种方式不仅提高了应用程序的可管理性,同时也降低了管理操作的复杂度。 #### 六、总结 JMX作为...

    JMX (三)--------spring整合JMX

    2. **定义MBeans**:MBeans可以通过两种方式创建:使用标准的`@ManagedResource`注解标记Spring Bean,或者通过实现`MBean`接口。使用注解的方式更加便捷,因为它可以自动暴露属性和操作。 3. **注册MBeans**:...

    JMXTools.jar和jmxri.jar下载

    在实际应用中,JMX常用于监控和管理Java应用程序的性能、配置或状态,例如,通过JConsole工具查看和调整应用程序的内存使用、线程状态,或者通过编程方式动态调整服务器配置。同时,JMX也是中间件和服务器产品(如...

    jmx第一个学习例子

    JMX中有两种MBean类型:Standard MBean和Dynamic MBean。Standard MBean实现较为直接,适合开发阶段的项目;而Dynamic MBean则更加灵活,允许更精细的管理和监控能力,但实现相对复杂。 通过上述知识点的解析,我们...

    基于JMX的Java虚拟机监视系统.pdf

    MBean有两种类型:标准MBean和开放MBean。标准MBean用于表示具有固定属性和操作的简单对象,而开放MBean则提供了更灵活的数据类型支持。在J2SE 5.0及以后版本的JVM中,已经内置了一个平台MBean服务器,提供了一系列...

    JMX入门

    Java Management Extensions(JMX)是一种Java平台上的标准框架,用于管理和监控应用程序、系统和服务。它允许开发者创建可管理和监控的组件,称为MBeans,这些组件提供了对系统资源的访问和控制。以下是对JMX关键...

    jmx-tools.zip

    3. `jmxri.jar`和`jmxtools.jar`:这两个JAR文件是JMX RMI实现的核心库,分别包含了RMI服务器和客户端的实现,使得远程JMX交互成为可能。 4. `jmxri.properties`和`jmxtools.properties`:这些配置文件可能包含了...

    JMX与JMS的概念

    JMS 支持两种消息模型: - **点对点(Point-to-Point)**:在这种模型中,消息由一个生产者发送到一个队列,然后由一个消费者接收。这种模式确保消息只被一个消费者接收,提供了一种可靠的单向通信方式。 - **发布...

Global site tag (gtag.js) - Google Analytics