`
can_do
  • 浏览: 248006 次
  • 性别: 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/////////////////////////////////////////////////////
分享到:
评论

相关推荐

    jolokia:辣椒素上的JMX

    Jolokia是一种远程访问JMX MBean的新方法。 它与JSR-160连接器的不同之处在于它是一种基于代理的方法,该方法使用REST风格的HTTP上的JSON进行通信。 为不同的环境提供了多个代理: 用于在Java EE Server中作为Web...

    JAVA_API1.6文档(中文)

    javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax...

    [Java参考文档].JDK_API 1.6

    javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax....

    java api最新7.0

    javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax....

    java jdk-api-1.6 中文 chmd

    javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax...

    JDK_1_6 API

    javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax....

    Java 1.6 API 中文 New

    javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax....

    JavaAPI1.6中文chm文档 part1

    javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax...

    JavaAPI中文chm文档 part2

    javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax...

    [Java参考文档]

    javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax...

    Spring攻略(第二版 中文高清版).part2

    本书共分为两卷。 第1章 Spring简介 1 1.1 实例化Spring IoC容器 1 1.1.1 问题 1 1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 ...

    Spring攻略(第二版 中文高清版).part1

    本书共分为两卷。 第1章 Spring简介 1 1.1 实例化Spring IoC容器 1 1.1.1 问题 1 1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 ...

Global site tag (gtag.js) - Google Analytics