基于JMX監控下的JBoss數據庫連接池
一、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。#p#
三、監控jboss數據庫連接池的實現
TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=#999999 border=1>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 : \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);
/*調用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 :\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();
}
}
}
【編輯推薦】
























