歡迎您光臨本站 註冊首頁

通過JMX監控Jboss資料庫連接池

←手機掃碼閱讀     火星人 @ 2014-03-10 , reply:0

  一、 JMX簡介

  JMX(Java Management Extensions, Java管理擴展)是一個為應用程序植入管理功能的框架.JMX是一套標準的代理和服務,實際上,用戶可以在任何Java應用程序中使用這些代理和服務實現管理.

  Jboss的成功就在於採用了JMX,從零開始、模塊化開發了Jboss伺服器和容器,實現了模塊化、嵌入式的技術架構.JMX作為集成中心(匯流排),可以很方便的熱插拔新的模塊和組件.JMX服務可以通過HTTP、RMI、SNMP等多種協議進行訪問,使其適合作為一個網路管理、監控平台的技術架構.

  二、JMX構架中的各層及相關的組件

  1. 工具層(Instrumentation Level)

  (a) MBeans(標準的,動態的,開放的和模型MBeans)

  (b) 通知模型:Notification、NotificationListener等類

  (c) MBean元數據類:Attribute、Opreator等類

  2. 代理層(Agent Level)

  (a) MBean Server

  (b) 代理服務.如jboss jmx-console下的HtmlAdaptorServer等.

   MBean:是Managed Bean的簡稱.在JMX中MBean代表一個被管理的資源實例,通過MBean中暴露的方法和屬性,外界可以獲取被管理的資源的狀態和操縱MBean的行為.事實上,MBean就是一個Java Object,同JavaBean模型一樣,外界使用自醒和反射來獲取Object的值和調用Object的方法,只是MBean更為複雜和高級一些.

   MBeanServer:MBean生存在一個MBeanServer中.MBeanServer管理這些MBean,並且代理外界對它們的訪問.並且MBeanServer提供了一種註冊機制,是的外界可以通過名字來得到相應的MBean實例.

   JMX Agent:Agent只是一個Java進程,它包括這個MBeanServer和一系列附加的MbeanService.當然這些Service也是通過MBean的形式來發布.

  Protocol Adapters and Connectors

  JMX Agent通過各種各樣的Adapter和Connector來與外界(JVM之外)進行通信.同樣外界(JVM之外)也必須通過某個Adapter和Connector來向JMX Agent發送管理或控制請求.

  Adapter和Connector的區別在於:Adapter是使用某種Internet協議來與JMX Agent獲得聯繫,Agent端會有一個對象(Adapter)來處理有關協議的細節.比如SNMP Adapter和HTTP Adapter.而Connector則是使用類似RPC的方式來訪問Agent,在Agent端和客戶端都必須有這樣一個對象來處理相應的請求與應答.比如RMI Connector.

  JMX Agent可以帶有任意多個Adapter,因此可以使用多種不同的方式訪問Agent.

  三、監控jboss資料庫連接池的實現

  

import java.util.Iterator;

  import java.util.Properties;

  import java.util.Set;

  import javax.management.MBeanInfo;

  import javax.management.MBeanOperationInfo;

  import javax.management.MBeanParameterInfo;

  import javax.management.ObjectInstance;

  import javax.management.ObjectName;

  import javax.naming.InitialContext;

  import org.jboss.jmx.adaptor.rmi.RMIAdaptor;

  public class DataSourceManger {

  public static void main(String[] args) {

  // TODO 自動生成方法存根

  try {

  // Get RMIAdaptor Object

  Properties pro = new Properties();

  pro.setProperty("java.naming.factory.initial",

  "org.jnp.interfaces.NamingContextFactory");

  pro.setProperty("java.naming.provider.url", "jnp://localhost:1099");

  pro.setProperty("java.naming.factory.url.pkgs",

  "org.jboss.naming:org.jnp.interfaces");

  InitialContext ic = new InitialContext(pro);

  RMIAdaptor server = (RMIAdaptor) ic.lookup("jmx/rmi/RMIAdaptor");

  ObjectName name = new ObjectName(

  "jboss.jca:name=jdbc/baosigpo,service=ManagedConnectionPool");

  ObjectName lname = new ObjectName(

  "jboss.jca:name=jdbc/baosigpo,service=LocalTxCM");

  String AvailableConnectionCount = server.getAttribute(name,

  "AvailableConnectionCount").toString();

  System.out.println("===========avlide============"

   AvailableConnectionCount);

  String InUseConnectionCount = server.getAttribute(name,

  "InUseConnectionCount").toString();

  System.out.println("===========InUseConnectionCount============"

   InUseConnectionCount);

  String ConnectionCreatedCount = server.getAttribute(name,

  "ConnectionCreatedCount").toString();

  System.out.println("===========ConnectionCreatedCount============"

   ConnectionCreatedCount);

  String ConnectionDestroyedCount = server.getAttribute(name,

  "ConnectionDestroyedCount").toString();

  System.out

  .println("===========ConnectionDestroyedCount============"

   ConnectionDestroyedCount);

  ConnectionDestroyedCount = server.getAttribute(name,

  "ConnectionDestroyedCount").toString();

  System.out

  .println("===========ConnectionDestroyedCount============"

   ConnectionDestroyedCount);

  String[] argTypes = new String[0];

  int i = 0;

  i = Integer.parseInt(AvailableConnectionCount);

  Object opReturn = null;

  if (i < 1) {//監控可用連接數.

  StringBuffer sb = new StringBuffer();

  sb.append("oper before DataSource Pool info : rn");

  sb.append(" AvailableConnectionCount="

   AvailableConnectionCount);

  sb.append(" InUseConnectionCount=" InUseConnectionCount);

  sb.append(" ConnectionCreatedCount="

   ConnectionCreatedCount);

  sb.append(" ConnectionDestroyedCount="

   ConnectionDestroyedCount);

  sb.append("rn");

  //opReturn = server.invoke(name, "flush", argTypes, argTypes);

  /*調用mbean的方法釋放連接 begin 本實現方法對應jboss3.2.3

  對於jboss4以後的版本只需調用

  //opReturn = server.invoke(name, "flush", argTypes, argTypes);

  **/

  opReturn = server.invoke(name, "stop", argTypes, argTypes);

  opReturn = server.invoke(name, "start", argTypes, argTypes);

  opReturn = server.invoke(lname, "stop", argTypes, argTypes);

  opReturn = server.invoke(lname, "start", argTypes, argTypes);

  /*調用mbean的方法釋放連接 end

  **/

  AvailableConnectionCount = server.getAttribute(name,

  "AvailableConnectionCount").toString();

  InUseConnectionCount = server.getAttribute(name,

  "InUseConnectionCount").toString();

  ConnectionCreatedCount = server.getAttribute(name,

  "ConnectionCreatedCount").toString();

  ConnectionDestroyedCount = server.getAttribute(name,

  "ConnectionDestroyedCount").toString();

  ConnectionDestroyedCount = server.getAttribute(name,

  "ConnectionDestroyedCount").toString();

  sb.append("oper afer DataSource Pool info :rn");

  sb.append(" AvailableConnectionCount="

   AvailableConnectionCount);

  sb.append(" InUseConnectionCount=" InUseConnectionCount);

  sb.append(" ConnectionCreatedCount="

   ConnectionCreatedCount);

  sb.append(" ConnectionDestroyedCount="

   ConnectionDestroyedCount);

  //writeLog(sb.toString()); 操作日誌信息

  System.out.println("===========op SUCCESS============");

  }

  } catch (Exception ex) {

  ex.printStackTrace();

  }

  }

  }


[火星人 ] 通過JMX監控Jboss資料庫連接池已經有749次圍觀

http://coctec.com/docs/java/show-post-61793.html