在配置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表示不需要鉴权:

  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

② 鉴权

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

  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示例代码

  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));

三、完整的示例代码文件

    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. 【Error】 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    mysql 登录输入密码有时会碰到如题的错误. 错误描述: Error 1045 (28000): Access denied for user 'root'@'localhost' (using p ...

  2. Linux mysql 5.6: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

    案例环境: 操作系统 :Red Hat Enterprise Linux Server release 5.7 (Tikanga) 64 bit 数据库版本 : Mysql 5.6.19 64 bit ...

  3. 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 ...

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

    MySQL安装完server端和客户端后,登录Mysql时报错:[root@rhel204 MySQL 5.6.23-RMP]# mysqlERROR 2002 (HY000): Can't conn ...

  5. 重置密码解决MySQL for Linux错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    出现报错: Warning: World-writable config file '/etc/my.cnf' is ignored // 该文件权限过高ERROR 1045 (28000): Acc ...

  6. 【转载】重置密码解决MySQL for Linux错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    重置密码解决MySQL for Linux错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor ...

  7. 解决mysql登录报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)问题

    问题描述: 在ubuntu14.04上安装完MYSQL后,MYSQL默认给分配了一个默认密码,但当自己在终端上使用默认密码登录的时候,总会提示一个授权失败的错误. 报错信息:Access denied ...

  8. 升级到macOS 10.12 mysqlb报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

    系统升级到macOS 10.12后启动mysql后,在终端输入mysql 报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' ...

  9. mysql 链接失败(ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES))

    mysql链接失败(ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)) 修改: # ...

随机推荐

  1. cogs 1143. [石门中学2009] 切割树

    1143. [石门中学2009] 切割树 ★   输入文件:treecut.in   输出文件:treecut.out   简单对比时间限制:1 s   内存限制:128 MB treecut 题目描 ...

  2. mac下安装配置java开发环境

    可以使用homebrew下载相关软件,以下具体讲一下环境的配置: mac下安装jdk vi .bash_profile 输入i,进入编辑模式 输入以下配置,其中JAVA_HOME是你的jdk安装目录 ...

  3. Python Study (01) 之 特殊方法

    Python深入:特殊方法和多范式 Python是一切皆对象,意思就是python的天生就是个"纯面向对象语言"呀. 但是!!! Python还是一个多范式语言(multi-par ...

  4. [Angular] Getting to Know the @Attribute Decorator in Angular

    So when you using input binding in Angular, it will always check for update. If you want to improve ...

  5. 【Android 应用开发】Android 平台 HTTP网速測试 案例 API 分析

    作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/25996817 工信部规定的网速測试标准 : 除普通网页測速 ...

  6. hdoj--1754--I Hate It(线段树)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. nyoj--114--某种序列(滚动数组)

    某种序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 数列A满足An = An-1 + An-2 + An-3, n >= 3  编写程序,给定A0, A1 和 ...

  8. 【SDOI 2016】 排列计数

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4517 [算法] 有m个数在原来的位置上,说明有(n-m)个数不再原来的位置上 那么, ...

  9. 杂项-DB:数据库

    ylbtech-杂项-DB:数据库   数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增.截取.更新.删除等操作. 所谓“数据库”是以一定方式储存在一起.能与 ...

  10. Ubuntu14.04下沙盒数据导入到 Neo4j 数据库(图文详解)

    不多说,直接上干货! 参考博客 http://blog.csdn.net/u012318074/article/details/72793914   (表示感谢) 前期博客 Neo4j沙盒实验申请过程 ...