在配置JMX远程访问的时候,设置jmxremote.password文件权限,修改该文件时添加写权限,chmod +w jmxremote.password ,放开角色信息那俩行的注释,保存,再使用chmod 0400 jmxremote.password

这样就是它正确的权限设置

jmxremote.password 在jdk/jre/lib/management/下,jmxremote.password.template复制,去掉.template后缀

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/51547408

2016年5月的最后一天,今天我将和大家分享Java中如何使用JMX来监控Tomcat的各种状态。好了,不多说了,我们直接进入主题

一、激活Tomcat的JMX远程配置

要通过JMX远程监控Tomcat,首先需要激活Tomcat的JMX远程配置。

① 修改脚本

先修改Tomcat的启动脚本,windows下为bin/catalina.bat(linux下为catalina.sh),添加以下内容,8999是jmxremote使用的端口号,第二个false表示不需要鉴权:

[plain] view plaincopy
  1. set JMX_REMOTE_CONFIG=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
  2. set CATALINA_OPTS=%CATALINA_OPTS% %JMX_REMOTE_CONFIG%

要注意以上语句的位置不能太后面,可以加在【if "%OS%" == "Windows_NT" setlocal】一句后的大段的注释后面。

参考官方说明:

http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html#Enabling_JMX_Remote

http://tomcat.apache.org/tomcat-7.0-doc/monitoring.html#Enabling_JMX_Remote

http://tomcat.apache.org/tomcat-8.0-doc/monitoring.html#Enabling_JMX_Remote

http://tomcat.apache.org/tomcat-9.0-doc/monitoring.html#Enabling_JMX_Remote

② 鉴权

上面的配置是不需要鉴权的,如果需要鉴权则添加的内容为:

[plain] view plaincopy
  1. set JMX_REMOTE_CONFIG=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=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
  2. set CATALINA_OPTS=%CATALINA_OPTS% %JMX_REMOTE_CONFIG%

③ 复制并修改授权文件

$JAVA_HOME/jre/lib/management下有jmxremote.access和jmxremote.password的模板文件,将两个文件复制到$CATALINA_BASE/conf目录下
◆ 修改$CATALINA_BASE/conf/jmxremote.access 添加内容:
     monitorRole readonly
     controlRole readwrite
◆ 修改$CATALINA_BASE/conf/jmxremote.password 添加内容:
     monitorRole chenfeng
     controlRole chenfeng
注意: 如果进行了以上步骤导致Tomcat启动不了,那么很可能是密码文件的权限问题
需要修改jmxremote.password文件的访问权限,只有运行Tomcat的用户才能拥有访问权限 :
      Windows的NTFS文件系统下,选中文件,点右键 -->“属性”-->“安全”--> 点“高级”--> 点“更改权限”--> 去掉“从父项继承....”--> 弹出窗口中选“删除”,这样就删除了所有访问权限。再选“添加”--> “高级”--> “立即查找”,选中你的用户(或用户组,如果选用户不行那就选用户组),例administrator,点“确定",“确定"。来到权限项目窗口,勾选“完全控制”,点“确定”,OK了。
官方的提示:
      The password file should be read-only and only accessible by the operating system user Tomcat is running as.

④验证配置

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

⑤ 使用jconsole测试JMX

运行$JAVA_HOME/bin目录下的jconsole.exe,打开J2SE监视和管理控制台,然后建立连接,如果是本地的Tomcat则直接选择然后点击连接,如果是远程的,则进入远程选项卡,填写地址、端口号、用户名、口令即可连接。。Mbean属性页中给出了相应的数据,Catalina中是tomcat的,java.lang是jvm的。对于加粗的黑体属性值,需双击一下才可看内容。

二、使用JMX监控Tomcat示例代码

[java] view plaincopy
  1. String jmxURL = "service:jmx:rmi:///jndi/rmi://192.168.10.93:8999/jmxrmi";
  2. JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);
  3. Map map = new HashMap();
  4. // 用户名密码,在jmxremote.password文件中查看
  5. String[] credentials = new String[] { "monitorRole", "tomcat" };
  6. map.put("jmx.remote.credentials", credentials);
  7. JMXConnector connector = JMXConnectorFactory.connect(serviceURL, map);
  8. MBeanServerConnection mbsc = connector.getMBeanServerConnection();
  9. // 端口最好是动态取得
  10. ObjectName threadObjName = new ObjectName("Catalina:type=ThreadPool,name=http-8080");
  11. MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName);
  12. // tomcat的线程数对应的属性值
  13. String attrName = "currentThreadCount";
  14. MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes();
  15. System.out.println("currentThreadCount:" + mbsc.getAttribute(threadObjName, attrName));

三、完整的示例代码文件

[java] view plaincopy
  1. import java.lang.management.MemoryUsage;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. import java.util.Formatter;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.Map;
  8. import java.util.Set;
  9. import javax.management.MBeanAttributeInfo;
  10. import javax.management.MBeanInfo;
  11. import javax.management.MBeanServerConnection;
  12. import javax.management.ObjectInstance;
  13. import javax.management.ObjectName;
  14. import javax.management.openmbean.CompositeDataSupport;
  15. import javax.management.remote.JMXConnector;
  16. import javax.management.remote.JMXConnectorFactory;
  17. import javax.management.remote.JMXServiceURL;
  18. /**
  19. * @author liuyazhuang
  20. * @date 2016-05-31
  21. */
  22. public class JMXTest {
  23. /**
  24. * main方法
  25. * @param args
  26. */
  27. public static void main(String[] args) {
  28. try {
  29. String jmxURL = "service:jmx:rmi:///jndi/rmi://127.0.0.1:8999/jmxrmi";
  30. JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);
  31. Map map = new HashMap();
  32. String[] credentials = new String[] { "monitorRole", "tomcat" };
  33. map.put("jmx.remote.credentials", credentials);
  34. JMXConnector connector = JMXConnectorFactory.connect(serviceURL,
  35. map);
  36. MBeanServerConnection mbsc = connector.getMBeanServerConnection();
  37. // 端口最好是动态取得
  38. ObjectName threadObjName = new ObjectName(
  39. "Catalina:type=ThreadPool,name=http-8080");
  40. MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName);
  41. String attrName = "currentThreadCount";// tomcat的线程数对应的属性值
  42. MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes();
  43. System.out.println("currentThreadCount:"
  44. + mbsc.getAttribute(threadObjName, attrName));
  45. // heap
  46. for (int j = 0; j < mbsc.getDomains().length; j++) {
  47. System.out.println("###########" + mbsc.getDomains()[j]);
  48. }
  49. Set MBeanset = mbsc.queryMBeans(null, null);
  50. System.out.println("MBeanset.size() : " + MBeanset.size());
  51. Iterator MBeansetIterator = MBeanset.iterator();
  52. while (MBeansetIterator.hasNext()) {
  53. ObjectInstance objectInstance = (ObjectInstance) MBeansetIterator
  54. .next();
  55. ObjectName objectName = objectInstance.getObjectName();
  56. String canonicalName = objectName.getCanonicalName();
  57. System.out.println("canonicalName : " + canonicalName);
  58. if (canonicalName
  59. .equals("Catalina:host=localhost,type=Cluster")) {
  60. // Get details of cluster MBeans
  61. System.out.println("Cluster MBeans Details:");
  62. System.out
  63. .println("=========================================");
  64. // getMBeansDetails(canonicalName);
  65. String canonicalKeyPropList = objectName
  66. .getCanonicalKeyPropertyListString();
  67. }
  68. }
  69. // ------------------------- system ----------------------
  70. ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime");
  71. System.out.println("厂商:"
  72. + (String) mbsc.getAttribute(runtimeObjName, "VmVendor"));
  73. System.out.println("程序:"
  74. + (String) mbsc.getAttribute(runtimeObjName, "VmName"));
  75. System.out.println("版本:"
  76. + (String) mbsc.getAttribute(runtimeObjName, "VmVersion"));
  77. Date starttime = new Date((Long) mbsc.getAttribute(runtimeObjName,
  78. "StartTime"));
  79. SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  80. System.out.println("启动时间:" + df.format(starttime));
  81. Long timespan = (Long) mbsc.getAttribute(runtimeObjName, "Uptime");
  82. System.out.println("连续工作时间:" + JMXTest.formatTimeSpan(timespan));
  83. // ------------------------ JVM -------------------------
  84. // 堆使用率
  85. ObjectName heapObjName = new ObjectName("java.lang:type=Memory");
  86. MemoryUsage heapMemoryUsage = MemoryUsage
  87. .from((CompositeDataSupport) mbsc.getAttribute(heapObjName,
  88. "HeapMemoryUsage"));
  89. long maxMemory = heapMemoryUsage.getMax();// 堆最大
  90. long commitMemory = heapMemoryUsage.getCommitted();// 堆当前分配
  91. long usedMemory = heapMemoryUsage.getUsed();
  92. System.out.println("heap:" + (double) usedMemory * 100
  93. / commitMemory + "%");// 堆使用率
  94. MemoryUsage nonheapMemoryUsage = MemoryUsage
  95. .from((CompositeDataSupport) mbsc.getAttribute(heapObjName,
  96. "NonHeapMemoryUsage"));
  97. long noncommitMemory = nonheapMemoryUsage.getCommitted();
  98. long nonusedMemory = heapMemoryUsage.getUsed();
  99. System.out.println("nonheap:" + (double) nonusedMemory * 100
  100. / noncommitMemory + "%");
  101. ObjectName permObjName = new ObjectName(
  102. "java.lang:type=MemoryPool,name=Perm Gen");
  103. MemoryUsage permGenUsage = MemoryUsage
  104. .from((CompositeDataSupport) mbsc.getAttribute(permObjName,
  105. "Usage"));
  106. long committed = permGenUsage.getCommitted();// 持久堆大小
  107. long used = heapMemoryUsage.getUsed();//
  108. System.out.println("perm gen:" + (double) used * 100 / committed
  109. + "%");// 持久堆使用率
  110. // -------------------- Session ---------------
  111. ObjectName managerObjName = new ObjectName(
  112. "Catalina:type=Manager,*");
  113. Set<ObjectName> s = mbsc.queryNames(managerObjName, null);
  114. for (ObjectName obj : s) {
  115. System.out.println("应用名:" + obj.getKeyProperty("path"));
  116. ObjectName objname = new ObjectName(obj.getCanonicalName());
  117. System.out.println("最大会话数:"
  118. + mbsc.getAttribute(objname, "maxActiveSessions"));
  119. System.out.println("会话数:"
  120. + mbsc.getAttribute(objname, "activeSessions"));
  121. System.out.println("活动会话数:"
  122. + mbsc.getAttribute(objname, "sessionCounter"));
  123. }
  124. // ----------------- Thread Pool ----------------
  125. ObjectName threadpoolObjName = new ObjectName(
  126. "Catalina:type=ThreadPool,*");
  127. Set<ObjectName> s2 = mbsc.queryNames(threadpoolObjName, null);
  128. for (ObjectName obj : s2) {
  129. System.out.println("端口名:" + obj.getKeyProperty("name"));
  130. ObjectName objname = new ObjectName(obj.getCanonicalName());
  131. System.out.println("最大线程数:"
  132. + mbsc.getAttribute(objname, "maxThreads"));
  133. System.out.println("当前线程数:"
  134. + mbsc.getAttribute(objname, "currentThreadCount"));
  135. System.out.println("繁忙线程数:"
  136. + mbsc.getAttribute(objname, "currentThreadsBusy"));
  137. }
  138. } catch (Exception e) {
  139. e.printStackTrace();
  140. }
  141. }
  142. public static String formatTimeSpan(long span) {
  143. long minseconds = span % 1000;
  144. span = span / 1000;
  145. long seconds = span % 60;
  146. span = span / 60;
  147. long mins = span % 60;
  148. span = span / 60;
  149. long hours = span % 24;
  150. span = span / 24;
  151. long days = span;
  152. return (new Formatter()).format("%1$d天 %2$02d:%3$02d:%4$02d.%5$03d",
  153. days, hours, mins, seconds, minseconds).toString();
  154. }
  155. }

Error: Password file read access must be restricted: /etc/cassandra/jmxremote.password相关推荐

  1. MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)的真正原因...

    在博客Linux mysql 5.6: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: N ...

  2. 完整过程解决 ERROR 1045 (28000): Access denied for user 'mysql'@'localhost' (using password: NO)

    ERROR 1045 (28000): Access denied for user 'mysql'@'localhost' (using password: NO) 此问题网上大部分都是围绕下面的第 ...

  3. MySQL登录时ERROR 1045:Access denied for user ‘root’@’localhost’ (using password: YES)

    MySQL登录时ERROR 1045错误 win10_x64系统中登录MySQL时出现1045错误 错误描述: ERROR 1045:Access denied for user 'root'@'lo ...

  4. MySQL在登陆时出现ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)错误...

    错误显示:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 解决方案: 1.找到配 ...

  5. ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

    mysql Access denied for user root@localhost错误解决方法总结 www.111cn.net  2012-10-19  编辑:kp12345 mysql Acce ...

  6. 解决 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 问题

    最近新装好的mysql在进入mysql工具时,总是有错误提示: # mysql -u root -p Enter password: ERROR 1045 (28000): Access denied ...

  7. mysql:mysql error:Access denied for user 'root'@'localhost' (using password: YES)

    在给服务器添加用户的时候,一不小心添加主机名错误.我直接把ip给添加上去了,这就十分尴尬了,然后在修改的时候碰到了这个问题,记录一下. 一.mysql添加用户时的操作: insert into mys ...

  8. ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password

    linux环境下,mysql安装完后,经常出现如上问题:连接不上mysql 错误描述: Mysql中添加用户之后可能出现登录时提示ERROR 1045 (28000): Access denied f ...

  9. (已解决) MySQL: ERROR 1045 (28000): Access denied for user 'xxxxx'@'localhost' (using password: NO)

    目录 问题描述 解决办法: 1.登录到root 2. 查询用户名 3. 找到自己的user和host删除 解决done 问题描述 给用户权限时不知道 弄错了什么,重新输入mysql命令时报错: ERR ...

最新文章

  1. Spark Streaming揭秘 Day9 从Receiver的设计到Spark框架的扩展
  2. (笔试题)程序运行时间
  3. Python爬虫入门(6):Cookie的使用
  4. mysql 高性能引擎_《高性能MySQL》笔记1-MySQL架构与引擎
  5. Delphi 与 DirectX 之 DelphiX(71): TDIB.Negative;
  6. P5787 二分图 /【模板】线段树分治(线段树分治、并查集)
  7. oracle停止trace日志,关闭ORACLE客户端trace日志
  8. freebsd查询php5的版本,FreeBSD下查看各软件版本命令
  9. 关于android 双击事件
  10. 【flink】flink Source Coordinator Thread already exists driving actions Source Coordinator. Existing
  11. ng执行css3动画
  12. 消息已读未读的模型设计_构建一个即时消息应用(三):对话 | Linux 中国
  13. VC++ 求绝对值函数
  14. java手机翻译,使用JUniversal翻译Android项目
  15. 产品经理要学习的技术都在这里
  16. 台式计算机的配置清单表格,电脑配置清单表格,为你分别介绍不同价位的三种配置清单...
  17. P2916 [USACO08NOV]Cheering up the Cow G 题解
  18. PLC、运动控制卡、运动控制器,傻傻分不清
  19. 如何提高存货周转率?存货周转率真的越高越好吗?
  20. 朴素贝叶斯+语言模型

热门文章

  1. JS里在光标位置插入字符
  2. 2 s锁是什么_innodb存储引擎读书笔记:锁
  3. 前端交接文档_开发型Web前端和设计型Web前端的区别是什么?
  4. 基于NopCommerce的开源电商系统改造总结
  5. 2015-2016 Petrozavodsk Winter Training Camp, Nizhny Novgorod SU Contest
  6. IIS Express总结
  7. Deconvolution与Upsampling的区别
  8. 从头开始 启动开源电商项目jShop
  9. ARC中的三个关键字
  10. 技术人生:遇到挫折,不可轻言放弃。