前面两篇JMX远程监控Tomcat服务器是没配置密码的,下面介绍在Tomcat监控时配置用户密码。
来源博客:http://blog.csdn.net/fengshizty
具体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 |
||
-Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access |
||
monitorRole readonly controlRole readwrite |
||
monitorRole tomcat controlRole tomcat |
||
1、编辑Tomcat/bin中的catalina.bat。如果配置权限,需要将autenticate设置为true,将1中的下面两行代码添加到最上面一行,注意:这些所有的命令必须在一行!。
2、在Tomcat/conf目录下新建两个文件:jmxremote.access和jmxremote.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; } }
来源博客:http://blog.csdn.net/fengshizty
拿了张工作图,不会侵权吧。。。