设为首页 收藏本站
查看: 596|回复: 0

[经验分享] JMX 远程监控 JBoos/Tomcat

[复制链接]

尚未签到

发表于 2017-1-24 08:23:42 | 显示全部楼层 |阅读模式
● 启用JBoss JMX远程访问的身份验证:
在目录%JBoss_Home%/server\default\deploy 下找到文件 jmx-jboss-beans.xml,在该文件的大约21-23行,找到
<!--UNCOMMENT THIS <property name="securityDomain">jmx-console</property> -->去掉注释,修改为:
<property name="securityDomain">jmx-console</property>
JBoss 默认的用户名为:admin,密码为:admin。用户的访问权限为:JBossAdmin,HttpInvoker。
如果要修改用户名和密码,可以在目录%JBoss_Home%/server\default\conf\props 下找到文件 jmx-console-roles.properties,在里面进行修改即可。
如果要修改用户的访问权限,可以在目录%JBoss_Home%/server\default\conf\props 下找到文件 jmx-console-users.properties ,在里面进行修改即可。
JBoss JMX 远程访问的默认端口为:1090。.如果要修改该端口,可以在目录
%JBoss_Home%/server\default\conf\bindingservice.beans\META-INF 下找到文件 bindings-jboss-beans.xml ,大约在244 行,进行修改即可。
● 启用Tomcat JMX 远程访问身份验证:
因为Tomcat 是通过JDK 进行JMX 远程管理的,所以要在JDK 中添加username,password 和 访问权限。
找到目录 %JAVA_HOME%\jre\lib\management 下的文件 jmxremote.password.template 和 jmxremote.access。
jmxremote.password.template 是一个模板文件,提供了如何创建用户名和密码的格式,在最后可以看到JDK 提供了两个用户名和密码,只不过是通过“#”注释掉了,
然后再改目录下新建一个 jmxremote.password 文件,在这个新建的文件里添加用户名和密码,例如:admin admin。
jmxremote.access 文件是配置用户访问权限的,在最后添加 admin  readonly 或 admin readwrite。
再在目录%TOMCAT_HOME%\bin 下找到 文件 catalina.bat,编辑这个文件,在里面添加:

set JAVA_OPTS=%JAVA_OPTS% -Djava.rmi.server.hostname=192.168.100.126
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port="1090"   // 远程访问端口
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.authenticate="true"   // 身份验证
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.ssl="false"    //SSL验证

在window下,现需要jdk装在NTFS文件系统下,选中文件,点右键“属性”-〉安全,点“高级”,去掉“从父项继承....”,弹出窗口中选“删除”,这样删除了所有访问权限。再选“添加”-〉高级,“立即查找”,选中你的用户,例administrator,点“确定",“确定"。来到权限窗口,勾选"完全控制",点"确定",OK了。
● 通过jconsole 监控 JBoss/Tomcat
打开%JAVA_HOME%\bin\jconsole.exe 在“远程进程”中输入“192.168.0.88:1090”,用户名“admin”,口令 “admin”,就可监控 IP 为“192.168.0.88” 的JBoss/Tomcat 服务器。
● 通过Java 程序获得JBoss/Tomcat 中的信息
package com.demo.jmx.jconsole;
import java.lang.management.MemoryUsage;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class JMXMonitor {
         private static final String URL = "service:jmx:rmi:///jndi/rmi://127.0.0.1:1090/jmxrmi";
         protected MBeanServerConnection  mbsc;
         private String path;
         private Integer maxActiveSessions;
         private Integer activeSessions;
         private Integer sessionCounter;
         private long maxMemory;
         private long committedMemory;
         private long usedMemory;
         private String protocolPort;
         private Integer maxThreads;
         private Integer currentThreadCount;
         private Integer currentThreadsBusy;
 
         public JMXMonitor() throws Exception{
                    JMXServiceURL serviceURL = new JMXServiceURL(URL);
                    Map<String,String[]>map = new HashMap<String,String[]>();   
                    String[] credentials = new String[] { "admin" , "admin" };   
                    map.put("jmx.remote.credentials", credentials);   
                    JMXConnector connector = JMXConnectorFactory.connect(serviceURL, map);   
                    mbsc = connector.getMBeanServerConnection(); 
          }
 
          public Map<?,?>createSessionCounter()throws Exception{
                     String objectName = "jboss.web:type=Manager,path=/*,host=localhost"; //JBoss
                     //String objectName1 = "Catalina:type=Manager,context=/*,host=localhost"; //Tomcat
                     ObjectName managerObjName = new ObjectName(objectName);
                     Set<ObjectName> set=mbsc.queryNames(managerObjName, null); 
                     Map<String,JMXMonitor> map = new HashMap<String,JMXMonitor>();
  
                     for (ObjectName obj:set){  
                              if(objectName.indexOf(objectName)!= -1)
                                       path = obj.getKeyProperty("path"); 
                              if(path.indexOf(objectName)!= -1)
                                       path = obj.getKeyProperty("context");
                              ObjectName objname = new ObjectName(obj.getCanonicalName()); 
                              maxActiveSessions = (Integer)mbsc.getAttribute( objname, "maxActiveSessions");
                              activeSessions = (Integer)mbsc.getAttribute( objname, "activeSessions");
                              sessionCounter = (Integer)mbsc.getAttribute( objname, "sessionCounter");  
                              map.put(path, this);
                     } 
                     return map;
            }
 
            public void createHeapMemoryCounter() throws Exception{
                       String objectName = "java.lang:type=Memory";
                       ObjectName heapObjName = new ObjectName(objectName);
                       CompositeDataSupport cds = (CompositeDataSupport)mbsc.getAttribute(heapObjName, "HeapMemoryUsage");
                       MemoryUsage heapMemoryUsage =  MemoryUsage.from(cds);
                       maxMemory = heapMemoryUsage.getMax();
                       committedMemory = heapMemoryUsage.getCommitted();
                       usedMemory = heapMemoryUsage.getUsed();
  
            }
 
            public Map<?,?>createThreadPoolCounter() throws Exception{
                      String objectName = "jboss.web:type=ThreadPool,name=*"//JBoss
                      //String objectName = "Catalina:type=ThreadPool,name=*"; //Tomcat
                      ObjectName threadPoolObjName = new ObjectName(objectName);
                      Set<ObjectName> set=mbsc.queryNames(threadPoolObjName, null);
                      Map<String,JMXMonitor> map = new HashMap<String,JMXMonitor>();
                      for (ObjectName obj:set){  
                             protocolPort = obj.getKeyProperty("name");
                             ObjectName objname=new ObjectName(obj.getCanonicalName()); 
                             maxThreads = (Integer)mbsc.getAttribute( objname, "maxThreads");
                             currentThreadCount = (Integer)mbsc.getAttribute( objname, "currentThreadCount");
                             currentThreadsBusy = (Integer)mbsc.getAttribute( objname, "currentThreadsBusy");
                             map.put(protocolPort, this);
                     }   
                      return map;
            }

            public String getPath() {
                      return path;
            }

            public Integer getMaxActiveSessions() {
                    return maxActiveSessions;
             }

             public Integer getActiveSessions() {
                   return activeSessions;
              }

              public Integer getSessionCounter() {
                    return sessionCounter;
              }

              public long getMaxMemory() {
                      return maxMemory;
              }

              public long getCommittedMemory() {
                       return committedMemory;
               }

               public long getUsedMemory() {
                       return usedMemory;
               }

               public String getProtocolPort() {
                        return protocolPort;
               }

               public Integer getMaxThreads() {
                       return maxThreads;
               }

               public Integer getCurrentThreadCount() {
                        return currentThreadCount;
               }

               public Integer getCurrentThreadsBusy() {
                        return currentThreadsBusy;
               }

}
     

测试类
package com.demo.jmx.jconsole;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class JMXTest {
              public static void main(String[] args) throws Exception{
                        JMXMonitor monitor = new JMXMonitor();
                        Map<?,?>sessionMap = monitor.createSessionCounter();
                        Set<?>pathSet = sessionMap.keySet();
                         Iterator<?>it = pathSet.iterator();
                        while(it.hasNext()){
                                  String path = (String)it.next();
                                  System.out.println("path:" + path);
                                  JMXMonitor seesionMonitor = (JMXMonitor)sessionMap.get(path);
                                  System.out.println("activeSessions:" + seesionMonitor.getActiveSessions());
                                  System.out.println("maxActiveSessions:" + seesionMonitor.getMaxActiveSessions());
                                  System.out.println("activeSessions:" + seesionMonitor.getSessionCounter());
                                  System.out.println();
                       }
  
                      System.out.println("#######################################################");
  
                      monitor.createHeapMemoryCounter();
                      long committedMemory = monitor.getCommittedMemory();
                      long maxMemory = monitor.getMaxMemory();
                      long usedMemory = monitor.getUsedMemory();
                      System.out.println("committedMemory:" + committedMemory);
                      System.out.println("maxMemory:" + maxMemory);
                      System.out.println("usedMemory:" + usedMemory);
  
                      System.out.println("#######################################################");
                      Map<?,?> threadPoolMap = monitor.createThreadPoolCounter();
                      Set<?> protocolPortSet = threadPoolMap.keySet();
                      Iterator<?>it1 = protocolPortSet.iterator();
                      while(it1.hasNext()){
                                  String protocolPort = (String)it1.next();
                                  System.out.println("protocol-Port:" + protocolPort);
                                  JMXMonitor threadPoolMonitor = (JMXMonitor)threadPoolMap.get(protocolPort);
                                  System.out.println("currentThreadCount:" + threadPoolMonitor.getCurrentThreadCount());
                                  System.out.println("currentThreadsBusy:" + threadPoolMonitor.getCurrentThreadsBusy());
                                  System.out.println("maxThreads:" + threadPoolMonitor.getMaxThreads());
                                  System.out.println();
                       }
              }

}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-332638-1-1.html 上篇帖子: tomcat standardServer.await: create[8005]: 下篇帖子: tomcat 内存不足问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表