開(kāi)源技術(shù):通過(guò)JMX監(jiān)控Jboss數(shù)據(jù)庫(kù)連接池

字號(hào):

一、 JMX簡(jiǎn)介
    JMX(Java Management Extensions, Java管理擴(kuò)展)是一個(gè)為應(yīng)用程序植入管理功能的框架。JMX是一套標(biāo)準(zhǔn)的代理和服務(wù),實(shí)際上,用戶可以在任何Java應(yīng)用程序中使用這些代理和服務(wù)實(shí)現(xiàn)管理。
    Jboss的成功就在于采用了JMX,從零開(kāi)始、模塊化開(kāi)發(fā)了Jboss服務(wù)器和容器,實(shí)現(xiàn)了模塊化、嵌入式的技術(shù)架構(gòu)。JMX作為集成中心(總線),可以很方便的熱插拔新的模塊和組件。JMX服務(wù)可以通過(guò)HTTP、RMI、SNMP等多種協(xié)議進(jìn)行訪問(wèn),使其適合作為一個(gè)網(wǎng)絡(luò)管理、監(jiān)控平臺(tái)的技術(shù)架構(gòu)。
    二、JMX構(gòu)架中的各層及相關(guān)的組件
    1. 工具層(Instrumentation Level)
    (a) MBeans(標(biāo)準(zhǔn)的,動(dòng)態(tài)的,開(kāi)放的和模型MBeans)
    (b) 通知模型:Notification、NotificationListener等類
    (c) MBean元數(shù)據(jù)類:Attribute、Opreator等類
    2. 代理層(Agent Level)
    (a) MBean Server
    (b) 代理服務(wù)。如jboss jmx-console下的HtmlAdaptorServer等。
    MBean:是Managed Bean的簡(jiǎn)稱。在JMX中MBean代表一個(gè)被管理的資源實(shí)例,通過(guò)MBean中暴露的方法和屬性,外界可以獲取被管理的資源的狀態(tài)和操縱MBean的行為。事實(shí)上,MBean就是一個(gè)Java Object,同JavaBean模型一樣,外界使用自醒和反射來(lái)獲取Object的值和調(diào)用Object的方法,只是MBean更為復(fù)雜和高級(jí)一些。
    MBeanServer:MBean生存在一個(gè)MBeanServer中。MBeanServer管理這些MBean,并且代理外界對(duì)它們的訪問(wèn)。并且MBeanServer提供了一種注冊(cè)機(jī)制,是的外界可以通過(guò)名字來(lái)得到相應(yīng)的MBean實(shí)例。
    JMX Agent:Agent只是一個(gè)Java進(jìn)程,它包括這個(gè)MBeanServer和一系列附加的MbeanService。當(dāng)然這些Service也是通過(guò)MBean的形式來(lái)發(fā)布。
    Protocol Adapters and Connectors
    JMX Agent通過(guò)各種各樣的Adapter和Connector來(lái)與外界(JVM之外)進(jìn)行通信。同樣外界(JVM之外)也必須通過(guò)某個(gè)Adapter和Connector來(lái)向JMX Agent發(fā)送管理或控制請(qǐng)求。
    Adapter和Connector的區(qū)別在于:Adapter是使用某種Internet協(xié)議來(lái)與JMX Agent獲得聯(lián)系,Agent端會(huì)有一個(gè)對(duì)象(Adapter)來(lái)處理有關(guān)協(xié)議的細(xì)節(jié)。比如SNMP Adapter和HTTP Adapter。而Connector則是使用類似RPC的方式來(lái)訪問(wèn)Agent,在Agent端和客戶端都必須有這樣一個(gè)對(duì)象來(lái)處理相應(yīng)的請(qǐng)求與應(yīng)答。比如RMI Connector。
    JMX Agent可以帶有任意多個(gè)Adapter,因此可以使用多種不同的方式訪問(wèn)Agent。
    三、監(jiān)控jboss數(shù)據(jù)庫(kù)連接池的實(shí)現(xiàn)
    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 自動(dòng)生成方法存根
    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) {//監(jiān)控可用連接數(shù)。
    StringBuffer sb = new StringBuffer();
    sb.append("oper before DataSource Pool info : \r\n");
    sb.append(" AvailableConnectionCount="
    + AvailableConnectionCount);
    sb.append(" InUseConnectionCount=" + InUseConnectionCount);
    sb.append(" ConnectionCreatedCount="
    + ConnectionCreatedCount);
    sb.append(" ConnectionDestroyedCount="
    + ConnectionDestroyedCount);
    sb.append("\r\n");
    //opReturn = server.invoke(name, "flush", argTypes, argTypes);
    /*調(diào)用mbean的方法釋放連接 begin 本實(shí)現(xiàn)方法對(duì)應(yīng)jboss3.2.3
    對(duì)于jboss4以后的版本只需調(diào)用
    //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);
    /*調(diào)用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 :\r\n");
    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();
    }
    }
    }