Tomcat配置JMX远程监控 Win7 Linxu

一:Window7下配置方式。

1、配置catalina.bat 在第一行加入下面配置 注意下面这些配置要在一行,注意包含空格。

<span style="font-size:14px;">set JAVA_OPTS=-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.10.126 -Dcom.sun.management.jmxremote.port=9008 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access</span>


-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx 主机地址,内网就写内网地址,外网就写外网地址。

-Dcom.sun.management.jmxremote.port=xxx  端口号、配置完端口号之后需要将此端口开放出来,注意防火墙拦截。

-Dcom.sun.management.jmxremote.authenticate=true 是否开启认证、false的时候可以不使用密码访问。


如果不开启认证,下面配置可以省略。

以下配置是开启认证时使用的access文件和password文件。

-Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password 

-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access 


2、拷贝授权文件,这二个文件在 \jdk1.7.0_07\jre\lib\management 文件夹下有模板文件,拷贝一份.放到tomcat/conf文件夹下面。

jmxremote.access

<span style="font-size:14px;">monitorRole   readonly
controlRole   readwrite \
              create javax.management.monitor.*,javax.management.timer.* \
              unregister</span>


jmxremote.password 

<span style="font-size:14px;">monitorRole  admin123
controlRole  admin321</span>


3、给密码文件授权,不然tomcat startup.bat闪退.

需要修改jmxremote.password文件的访问权限,只有运行Tomcat的用户才能拥有访问权限 :Windows的NTFS文件系统下,选中文件,点右键 -->“属性”-->“安全”--> 点“高级”--> 点“更改权限”--> 去掉“从父项继承....”--> 弹出窗口中选“删除”,这样就删除了所有访问权限。再选“添加”--> “高级”--> “立即查找”,选中你的用户(或用户组,如果选用户不行那就选用户组),例administrator,点“确定",“确定"。来到权限项目窗口,勾选“完全控制”,点“确定”,OK了。


4、重新启动Tomcat,在Windows命令行输入“ntstat -a”查看配置的端口号是否已打开,如果打开,说明上面的配置成功了。 


二:Linxu下配置

1、配置startup.sh

<span style="font-size:14px;">export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9008 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -Djava.rmi.server.hostname=136.16.19.82 -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access" </span>
把上面的配置加在 exec "$PRGDIR"/"$EXECUTABLE" start "$@" 这句话的前面。


2、制作授权文件和windows上面说的一样。

3、授权 chmod 600 jmx* 给文件授权,不然tomcat无法启动。

4、重新启动tomcat  在输入命令 netstat -an | grep 9008 查看端口是否被占用,如果占用,说明上面的配置成功了。



三、Java代码调用

package com;

import java.io.IOException;
import java.lang.management.ClassLoadingMXBean;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;
import java.lang.management.OperatingSystemMXBean;
import java.lang.management.ThreadMXBean;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;

import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServerConnection;
import javax.management.ReflectionException;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class T {

	//private final static String SERVICE_1 = "service:jmx:rmi:///jndi/rmi://xxx.xxx.xxx.xxx:9008/jmxrmi";
	private final static String SERVICE_1 = "service:jmx:rmi:///jndi/rmi://xxx.xxx.xxx.xxx:9008/jmxrmi";

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// 10秒调用一次
		Timer timer = new Timer();
		timer.schedule(new T().new MonitorTask(SERVICE_1), 0, 10000);

	}

	private class MonitorTask extends TimerTask {

		private String service;

		public MonitorTask(String service) {
			this.service = service;
		}

		@Override
		public void run() {

			JMXmonitor(service);
		}

	}

	private static void JMXmonitor(String service) {
		JMXConnector jmxConnector = null;

		try {
			JMXServiceURL ServiceURL = new JMXServiceURL(service);
			Map<String, String[]> environment = new HashMap<String, String[]>();
			// 用户名密码,在jmxremote.password文件中的密码
			String[] credentials = new String[] {"controlRole", "admin321"};
			environment.put("jmx.remote.credentials", credentials);
			jmxConnector = JMXConnectorFactory.connect(ServiceURL, environment);

			MBeanServerConnection mBeanServerConnection = jmxConnector
					.getMBeanServerConnection();

			// 获取MemoryMXBean
			System.out.println("\nMemory");
			MemoryMXBean memoryMXBean = ManagementFactory
					.newPlatformMXBeanProxy(mBeanServerConnection,
							ManagementFactory.MEMORY_MXBEAN_NAME,
							MemoryMXBean.class);

			MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();
			System.out.println("heapMemoryUsage :");
			System.out.println("committed = "
					+ convertKB(heapMemoryUsage.getCommitted()));
			System.out
					.println("init = " + convertKB(heapMemoryUsage.getInit()));
			System.out.println("max = " + convertKB(heapMemoryUsage.getMax()));
			System.out
					.println("used = " + convertKB(heapMemoryUsage.getUsed()));

			MemoryUsage nonHeapMemoryUsage = memoryMXBean
					.getNonHeapMemoryUsage();
			System.out.println("\nnonHeapMemoryUsage :");
			System.out.println("committed = "
					+ convertKB(nonHeapMemoryUsage.getCommitted()));
			System.out.println("init = "
					+ convertKB(nonHeapMemoryUsage.getInit()));
			System.out.println("max = "
					+ convertKB(nonHeapMemoryUsage.getMax()));
			System.out.println("used = "
					+ convertKB(nonHeapMemoryUsage.getUsed()));

			// 获取 ThreadMXBean
			System.out.println("\nThread");
			ThreadMXBean threadMXBean = ManagementFactory
					.newPlatformMXBeanProxy(mBeanServerConnection,
							ManagementFactory.THREAD_MXBEAN_NAME,
							ThreadMXBean.class);
			System.out
					.println("ThreadCount = " + threadMXBean.getThreadCount());
			System.out.println("DaemonThreadCount = "
					+ threadMXBean.getDaemonThreadCount());
			System.out.println("PeakThreadCount = "
					+ threadMXBean.getPeakThreadCount());
			System.out.println("CurrentThreadCpuTime = "
					+ threadMXBean.getCurrentThreadCpuTime());
			System.out.println("CurrentThreadUserTime = "
					+ threadMXBean.getCurrentThreadUserTime());

			System.out.println("\nClassLoading");
			ClassLoadingMXBean classLoadingMXBean = ManagementFactory
					.newPlatformMXBeanProxy(mBeanServerConnection,
							ManagementFactory.CLASS_LOADING_MXBEAN_NAME,
							ClassLoadingMXBean.class);
			// 当前加载到Java虚拟机中类的数量
			System.out.println("LoadedClassCount = "
					+ classLoadingMXBean.getLoadedClassCount());
			// Java 虚拟机开始执行到目前已经加载的类的总数。
			System.out.println("TotalLoadedClassCount = "
					+ classLoadingMXBean.getTotalLoadedClassCount());
			// Java 虚拟机开始执行到目前已经卸载的类的总数。
			System.out.println("UnloadedClassCount = "
					+ classLoadingMXBean.getUnloadedClassCount());

			System.out.println("\nCpu");
			OperatingSystemMXBean operatingSystemMXBean = ManagementFactory
					.newPlatformMXBeanProxy(mBeanServerConnection,
							ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME,
							OperatingSystemMXBean.class);
			System.out.println("AvailableProcessors = "
					+ operatingSystemMXBean.getAvailableProcessors());
			double ratio = 0.0;
			long start = System.currentTimeMillis();
			long startC;
			try {
				startC = (Long) mBeanServerConnection.getAttribute(operatingSystemMXBean.getObjectName(),"ProcessCpuTime");
				try {
					TimeUnit.SECONDS.sleep(5);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}

				long end = System.currentTimeMillis();
				long endC = (Long) mBeanServerConnection.getAttribute(operatingSystemMXBean.getObjectName(),"ProcessCpuTime");

				int availableProcessors = operatingSystemMXBean
						.getAvailableProcessors();
				ratio = (endC - startC) / 1000000.0 / (end - start)
						/ availableProcessors;

			} catch (AttributeNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (InstanceNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (MBeanException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (ReflectionException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

			System.out.println("CUP使用率" + round(ratio * 100) + "%");

		} catch (MalformedURLException e) {
			e.printStackTrace();
			System.out.println("非法的ServiceURL");
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (jmxConnector != null) {
					jmxConnector.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

	private static String convertKB(long src) {

		if (src <= 0L) {
			return "0KB";
		}
		double conversrc = src / 1024 / 1024;

		return round(conversrc) + "MB";
	}

	private static float round(double src) {
		return (float) (Math.round(src * 100)) / 100;
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值