用jmx监控多台服务器(tomcat)

因为需要写一个后台监控服务器的程序,涉及到jmx,也涉及到分布式的问题,最初在网上找相关资料的时候很少很少,后来才知道其实jmx这一块相关资料已经很多,java网站上已有比较多的完整例子。
最初使用jmx比较简单,安装java官网的例子很快就写出来了几个例子,但在应用中需要结合tomcat来使用,出现了一些问题,比如获取本地的MBeanServer时出错,网上查了些资料发现需要使用tomcat的一些东西,因此该为如下的方式获取MBeanServer即可

/**
* 获取本地MBeanServer
* @return
*/
private MBeanServer getLocalMBServer(){
MBeanServer mBeanServer = null;
if (MBeanServerFactory.findMBeanServer(null).size() > 0) {
mBeanServer =(MBeanServer) MBeanServerFactory.findMBeanServer(null).get(0);
} else {
mBeanServer = MBeanServerFactory.createMBeanServer();
}
return mBeanServer;
}


获取远程MBeanServerConnection时则是一个很严重的问题,最初使用如下方法
private MBeanServerConnection getRemoteMBConn(){
// String user = "monitorRole";
// String pw = "password";
// String[] credentials = new String[] { user, pw };
// Map<String, String[]> props = new HashMap<String, String[]>();
// props.put("jmx.remote.credentials", credentials);
JMXServiceURL address;
MBeanServerConnection mbs=null;
String jmxServerIp=ConfigUtils.getInstance().getOampConfig(OampConstants.JMX_SERVER_IP);//127.0.0.1
String jmxServerPort=ConfigUtils.getInstance().getOampConfig(OampConstants.JMX_SERVER_PORT);//9999
try {
// address =new JMXServiceURL("service:jmx:rmi:///jndi/rmi://127.0.0.1:9999/jmxrmi");
address =new JMXServiceURL("service:jmx:rmi:///jndi/rmi://"+jmxServerIp+":"+jmxServerPort+"/jmxrmi");
JMXConnector connector = JMXConnectorFactory.connect(address, null);
// address = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1234/jmxrmi");
// JMXConnector connector = JMXConnectorFactory.connect(address, props);
mbs= connector.getMBeanServerConnection();
connector.connect();
} catch (Exception e) {
SrvLogger.error("oamp", ClientMBServerManage.class, "Fail to getRemoteMBConn", e);
}
return mbs;
}

在一台机器上时并没有出现啥问题,一切运行正常,当我使用两台机器进行测试的时候则会出现异常,这个异常在网上搜了一下,相关的资料却很少很少,虽然自己也能看到后面具体的错误,
[code="java"]ava.io.IOException: Failed to retrieve RMIServer stub: javax.naming.NoInitialContextException: Cannot instantiate class: org.apache.naming.java.javaURLContextFactory [/code]
这个异常在tomcat启动完成之后,再获取链接则会抛出此异常,不知该咋解决呢,后来想到用rmi的另外一种地址形式,但还是不行,因为都走的是同一个思路。
参考了http://www.docjar.com/html/api/sun/tools/jconsole/ProxyClient.java.html这个网站上的代码,发现获取MBeanServerConnection有两种方式,具体的不是很清楚,只知道本地和远程有一些区别,因此自己试了一下居然就解决了两台机器间获取MBeanServerConnection的问题。修改的代码如下

/**
* 获取远程MBeanServerConnection
* @return
*/
private MBeanServerConnection getRemoteMBConn(String ip,String port){
// String user = "monitorRole";
// String pw = "password";
// String[] credentials = new String[] { user, pw };
// Map<String, String[]> props = new HashMap<String, String[]>();
// props.put("jmx.remote.credentials", credentials);

// JMXServiceURL address;
// SrvLogger.info(ServerMBClientManage.class,"getRemoteMBConn ip="+ip+";port="+port);
// MBeanServerConnection mbs=null;
// try {
// address =new JMXServiceURL("service:jmx:rmi://"+ip+"/jndi/rmi://"+ip+":"+port+"/jmxrmi");
// JMXConnector connector = JMXConnectorFactory.connect(address, null);
// mbs= connector.getMBeanServerConnection();
if(StringUtils.isEmpty(ip)||StringUtils.isEmpty(port)){
return null;
}
try{
MBeanServerConnection mbs=null;
Registry registry=LocateRegistry.getRegistry(ip, Integer.parseInt(port));
RMIServer stub=null;
JMXConnector jmxc=null;
if (stub == null) {
stub = (RMIServer) registry.lookup("jmxrmi");
}
jmxc = new RMIConnector(stub, null);
jmxc.connect();
mbs=jmxc.getMBeanServerConnection();
map.put(ip, mbs);
return mbs;
} catch (Exception e) {
// e.printStackTrace();
SrvLogger.error("oamp", ServerMBClientManage.class, "Fail to getRemoteMBConn", e);
}
return null;
}


这样经过测试就顺利解决了多台机器(tomcat)使用jmx的问题
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值