JMX实现远程服务器Tomcat系统监控之三

前面两篇JMX远程监控Tomcat服务器是没配置密码的,下面介绍在Tomcat监控时配置用户密码。

具体Tomcat地址:http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html#Enabling_JMX_Remote

Note: This syntax is for Microsoft Windows. The command has to be on the same line. It is wrapped to be more readable. If Tomcat is running as a Windows service, use its configuration dialog to set java options for the service. For un*xes remove
"set " from beginning of the line.

set CATALINA_OPTS=-Dcom.sun.management.jmxremote
  -Dcom.sun.management.jmxremote.port=%my.jmx.port%
  -Dcom.sun.management.jmxremote.ssl=false
  -Dcom.sun.management.jmxremote.authenticate=false
  1. If you require authorization, add and change this :

      -Dcom.sun.management.jmxremote.authenticate=true
      -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password
      -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access
    
  2. edit the access authorization file $CATALINA_BASE/conf/jmxremote.access :

    monitorRole readonly
    controlRole readwrite
    
  3. edit the password file $CATALINA_BASE/conf/jmxremote.password :

    monitorRole tomcat
    controlRole tomcat
    

    Tip: The password file should be read-only and only accessible by the operating system user Tomcat is running as.

其内容大概如下:

1、编辑Tomcat/bin中的catalina.bat。如果配置权限,需要将autenticate设置为true,将1中的下面两行代码添加到最上面一行,注意:这些所有的命令必须在一行!。

2、在Tomcat/conf目录下新建两个文件:jmxremote.accessjmxremote.password

第一个文件存的是角色信息,第二个存放的是密码信息(可修改)。

配置完上面信息后:我们启动tomcat时,Tomcat出现一闪而过,上面提示的大概意思是权限问题。

解决的办法是:选中Tomcat文件夹,点右键 -->“属性”-->“安全”--> 点“高级”--> 点“更改权限”--> 去掉“从父项继承....”--> 弹出窗口中选“删除”,这样就删除了所有访问权限。再选“添加”--> “高级”--> “立即查找”,选中你的用户(或用户组,如果选用户不行那就选用户组),例administrator(当前电脑的权限),点“确定",“确定"。来到权限项目窗口,勾选“完全控制”,点“确定”,重启就可以了。

实现:

没有密码时,我们采用JMXConnectorFactory工厂类的 connect(JMXServiceURL serviceURL) 创建到位于给定地址的连接器服务器的连接。 设置密码后需connect(JMXServiceURL serviceURL, Map<String,?> environment) ,

设置map存放environment.put("jmx.remote.credentials", credentials);配置信息。

String[] credentials = new String[] { "monitorRole", "tomcat" };

其具体实现如下:

package pyc.jvm.monitor;

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;

/**
 * 创建时间:2014-12-5 上午11:06:34
 *
 * @author zhangtianyou
 * @version 2.2
 */

public class JMXTest3 {

	private final static String SERVICE_1 = "service:jmx:rmi:///jndi/rmi://192.168.85.54:8787/jmxrmi";

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

		// 10秒调用一次
		Timer timer = new Timer();
		timer.schedule(new JMXTest3().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[] { "monitorRole", "tomcat" };
			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;
	}
}

嵌套在JavaEE中的效果如下:

时间: 2024-08-07 12:19:30

JMX实现远程服务器Tomcat系统监控之三的相关文章

JMX实现远程服务器系统监控之一

最近做多个远程服务器的系统监控,花费了不少的时间,下面就做一个总结 从JAVA 5开始,JDK提供了一些JVM检测的API,这就是有名的java.lang.management 包,包里提供了许多MXBean的接口类,可以很方便的获取到JVM的内存.GC.线程.锁.class.甚至操作系统层面的各种信息,本文就简单的介绍一种利用JMX对JAVA进程进行CPU.堆内存使用的监控.可能有人会觉得没必要这样做,因为用jconsole之类的工具都能做到,而且会比本文的例子更详细.但是有些时候将conso

本地win7,远程服务器XP系统,两台机器间不能拖动文件

(1)网上大部分说是rdpclip.exe(存放在c:/windows/system32)的问题,试了好几次,没有解决 (2)通过第二种方式解决,详细步骤如下所示: 1.点击进入远程连接. 2.选择本地资源  勾选打印机.剪贴板. 3.点击详细信息进入下一个窗口,然后勾选驱动器(勾选下属所有),点击保存完成. 4.进入远程服务器,然后可以在“其他”中看到上一步映射的你本机的磁盘

JMX实现远程服务器系统监控之二

接上一篇的下面提供另一种实现方式: 先看一个类图: JDK实现了九个自带的MBean,这些MBean能够监视虚拟机的所有信息:分别是如下 ManagementFactory工厂类通过ObjectName可以获取对应的MBean实例,自然就可以获取想要的数据了 2 代码如下: package pyc.jvm.monitor; import java.io.IOException; import java.lang.management.ClassLoadingMXBean; import java

Idea 2019.2 (Ultimate Edition) 部署项目到远程Linux服务器tomcat 详解

前言:之前做项目,一直都是把本地的源码打成war包上传到远程服务器tomcat/webapps下.每次都要重新打成war进行项目的部署,感觉特别繁琐. 步骤: 1.环境配置 前提:保证在远程linux服务器上安装好tomcat. 2.Linux服务器tomcat配置 (1)在Linux上找到我们安装的tomcat的目录: (2)在tomcat下的bin中找到catalina.sh,进行远程发布需要在catalina.sh这个启动脚本中增加一些配置: 编辑catalina.sh文件: 按inset

Eclipse调试远程服务器

Eclipse提供能调试远程服务器的功能,最近做微信开发,需要部署到远程服务器上才能和手机互调,所以配置了本地Eclipse调试远程服务器tomcat,下面做一个分享. 1.首先在tomcat的catalina文件中配置 window下配置catalina.bat,Linux下配置catalina.sh 添加到任意行,8787位监控端口(可随便写,只要未被占用) CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrun

Linux crontab的使用方式,sh脚本的编写,sh脚本自动启动tomcat服务器,sh监控系统运行情况

1.如果想使用Linux crontab(类似java quartz),需要先启动crontab.关于crontab的启动.关闭.重启.重新载入配置的方式如下: /sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 /sbin/service crond restart //重启服务 /sbin/service crond reload //重新载入配置 2.crontab的命令介绍: A:添加crontab的命令是:c

【监控】jvisualvm之jmx远程连接 tomcat war启动应用

一.tomcat相应jmx配置 1.在tomcat bin目录下的catalina.sh文件中添加如下配置: CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=8099 -Dcom.sun.management.jmxremote.ssl=false -Djava.net.pref

使用VisualVM监控远程服务器JVM

VisualVM是JDK自带的一款全能型性能监控和故障分析工具,包括对CPU使用.JVM堆内存消耗.线程.类加载的实时监控,内存dump文件分析,垃圾回收运行情况的可视化分析等,对故障排查和性能调优很有帮助.在windows中安装JDK后,VisualVM位于%JAVA_HOME%/bin/下,直接执行jvisualvm.exe即可,一个主要运行界面如图: VisualVM会自动检测本机运行中的JVM并建立连接,本文主要介绍连接远程Linux服务器的配置方法,测试环境为CentOS 6.5,JD

JVM监控远程服务器

1. 首先配置服务器端,进入服务器tomcat的bin目录下,打开catalina.sh配置文件,xxx为服务器配置路径. # cd /xxx/apache-tomcat-8.0.44/bin # vim catalina.sh 2. 修改文件中的JAVA_OPTS配置项,添加如下内容: -Dcom.sun.management.jmxremote.port=18999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.j