一、 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次圍觀