一、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();
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.
- 166.
- 167.
- 168.
- 169.
- 170.
- 171.
- 172.
- 173.
- 174.
- 175.
- 176.
- 177.
- 178.
- 179.
- 180.
- 181.
- 182.
- 183.
- 184.
- 185.
- 186.
- 187.
- 188.
- 189.
- 190.
- 191.
- 192.
- 193.
- 194.
- 195.
- 196.
- 197.
- 198.
- 199.
【编辑推荐】