`
canofy
  • 浏览: 821837 次
  • 性别: Icon_minigender_1
  • 来自: 北京、四川
社区版块
存档分类
最新评论

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

    博客分类:
  • j2EE
阅读更多
    因为需要写一个后台监控服务器的程序,涉及到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的问题


分享到:
评论

相关推荐

    通过Tomcat开启JMX监控的方法图解

    环境准备我们这里就不直接演示了,直接配置tomcat的jmx  1、进入到tomcat的bin目录下  # cd /opt/tomcat/apache-tomcat-8.0.48/bin/  2、编辑配置文件  # vim catalina.sh  3、在下图中上面添加参数    参数...

    tomcat zabbix 监控模板

    UserParameter=jmx7[*],/usr/local/zabbix/script/tomcat_status.sh $1 $2 $3 $4 $5 $6 $7 其中jmx5为过滤$1=$2 && $3=$4后, $5项的值 jmx3 为过滤$1=$2后,$3项的值 jmx7 为过滤$1=$2 && $3=$4 && $5=$6...

    tomcat-catalina-jmx-remote-8.0.9.jar

    当你想深入学习jvm的时候,肯定会用到。用于使用jvisualvm.exe远程监控服务器jvm

    JConsole_远程监控Tomcat_ricky

    JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,不过此JVM需要使用可管理的模式启动。如果要把一个应用以可管理的形式启动,可以在启动是设置com.sun.management.jmxremote。JConsole能够提供被监控虚拟机...

    Jpom项目监控软件-其他

    3、cpu、ram 监控、导出堆栈信息、查看项目进程端口、服务器状态监控 4、多节点管理、多节点自动分发 5、实时监控项目状态异常自动报警 6、在线构建项目发布项目一键搞定 7、多用户管理,用户项目权限独立(上传、...

    JAVA上百实例源码以及开源项目

    得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥验证签名结果,使用公钥初始化签名对象,用于...

    Jetty中文手册

    用JConsole监控Jetty 如何使用Jetty开发 Jetty HelloWorld教程 Jetty和Maven HelloWorld教程 Jetty(6)入门 (www.itjungle.com) Jetty Start.jar 配置Jetty 如何设置上下文(Context Path) 如何知道使用了那些jar包...

    springboot参考指南

    在前端代理服务器后使用Tomcat ix. 64.9. 使用Jetty替代Tomcat x. 64.10. 配置Jetty xi. 64.11. 使用Undertow替代Tomcat xii. 64.12. 配置Undertow xiii. 64.13. 启用Undertow的多监听器 xiv. 64.14. 使用Tomcat7 i...

    java开源包8

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包1

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包11

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包2

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包3

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包6

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包5

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包10

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包4

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包7

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包9

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

Global site tag (gtag.js) - Google Analytics