设为首页 收藏本站
查看: 549|回复: 0

[经验分享] 用jmx监控多台服务器(tomcat)

[复制链接]

尚未签到

发表于 2017-1-30 10:14:19 | 显示全部楼层 |阅读模式
因为需要写一个后台监控服务器的程序,涉及到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;
}

在一台机器上时并没有出现啥问题,一切运行正常,当我使用两台机器进行测试的时候则会出现异常,这个异常在网上搜了一下,相关的资料却很少很少,虽然自己也能看到后面具体的错误,
ava.io.IOException: Failed to retrieve RMIServer stub: javax.naming.NoInitialContextException: Cannot instantiate class: org.apache.naming.java.javaURLContextFactory [Root exception is java.lang.ClassNotFoundException: org.apache.naming.java.javaURLContextFactory]
这个异常在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的问题

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-335207-1-1.html 上篇帖子: jetty,tomcat maven 插件配置数据源 下篇帖子: tomcat中加入一个自己的线程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表