JMX监控tomcat的配置 银行安全系统的心得

1.测试环境 ubuntu版本 Linux系统
2.eclipse+Mac环境
3.ftp软件FileZilla

Linux需要配置信息(catalina.sh)。
配置前信息:
这里写图片描述
配置后信息:
这里写图片描述

        其中
        1.Dcom.sun.management.jmxremote.port=1099设置的是你用来运行监听程序的端口号。在设置端口号前,务必保证端口号没有被其他程序占用。
        2.Dcom.sun.management.jmxremote.ssl=false设置的是不开启ssl安全认证。
        3.  Dcom.sun.management.jmxremote.authenticate=false设置的是不开启用户名和密码认证,如果要开启该认证需要去jdk中的etc/java/management中的jmxremote.access和jmxremote.password中最后两行的#去掉。即可以打开用户名密码认证。
        4.  Djava.rmi.server.hostname=192.168.31.79这里的ip则需要设置你运行tomcat环境的ip地址。

下面则是代码运行jmx获取tomcat信息的代码片


import java.text.*;
import java.util.*;

import javax.management.*;
import javax.management.openmbean.*;
import javax.management.remote.*;
import java.lang.management.*;

public class jmx_tomocat {
    private static Formatter format = new Formatter();

    public static void main(String[] args) {
        try{

            String jmxUrl = "service:jmx:rmi:///jndi/rmi://192.168.31.79:1099/jmxrmi"; //动态唯一变量

            java.util.Map<String , String []> map = new java.util.HashMap<String , String []>();

            JMXServiceURL serviceURL = new JMXServiceURL(jmxUrl);

//          String [] credentials = new String[] { "monitorRole", "QED" }; 
//          map.put("jmx.remote.credentials", credentials);   //使用密码安全认证的情况

            map.put("jmx.remote.credentials", null);  //不使用密码安全认证的情况

            // JMXConnector connector = JMXConnectorFactory.connect(serviceURL,
                        // map);
                        JMXConnector connector = javax.management.remote.JMXConnectorFactory.connect(serviceURL, null);

                        MBeanServerConnection mbsc = connector.getMBeanServerConnection();

                        // 端口最好是动态取得
                        ObjectName grpObjName = new ObjectName("Catalina:type=GlobalRequestProcessor,*");
                        Set<ObjectName> grps = mbsc.queryNames(grpObjName, null);
                        for (ObjectName obj : grps) {
                            System.out.println("名称:" + obj.getKeyProperty("name"));
                            ObjectName objname = new ObjectName(obj.getCanonicalName());
                            System.out.println("bytesReceived:" + mbsc.getAttribute(objname, "bytesReceived"));
                            System.out.println("bytesSent:" + mbsc.getAttribute(objname, "bytesSent"));
                            System.out.println("requestCount:" + mbsc.getAttribute(objname, "requestCount"));
                        }

                        ObjectName threadObjName = new ObjectName("Catalina:type=ThreadPool,name=\"*http*\"");
                        Set<ObjectName> smbi = mbsc.queryNames(threadObjName, null);
                        for (ObjectName obj : smbi) {
                            System.out.println("端口名:" + obj.getKeyProperty("name"));
                            ObjectName objname = new ObjectName(obj.getCanonicalName());
                            System.out.println("最大线程数:" + mbsc.getAttribute(objname, "maxThreads"));
                            System.out.println("当前线程数:" + mbsc.getAttribute(objname, "currentThreadCount"));
                            System.out.println("繁忙线程数:" + mbsc.getAttribute(objname, "currentThreadsBusy"));
                        }

                        // ObjectName threadObjName1 = new
                        // ObjectName("Catalina:type=ThreadPool,name=\"http-apr-8080\"");
                        // MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName1);
                        //
                        // String attrName = "currentThreadCount";// tomcat的线程数对应的属性值
                        // MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes();
                        // System.out.println("currentThreadCount:" +
                        // mbsc.getAttribute(threadObjName1, attrName));

                        // heap
                        for (int j = 0; j < mbsc.getDomains().length; j++) {
                            System.out.println("###########" + mbsc.getDomains()[j]);
                        }

                        Set<?> MBeanset = mbsc.queryMBeans(null, null);
                        System.out.println("MBeanset.size() : " + MBeanset.size());
                        Iterator<?> MBeansetIterator = MBeanset.iterator();
                        while (MBeansetIterator.hasNext()) {
                            ObjectInstance objectInstance = (ObjectInstance) MBeansetIterator.next();
                            ObjectName objectName = objectInstance.getObjectName();
                            String canonicalName = objectName.getCanonicalName();
                            System.out.println("canonicalName : " + canonicalName);
                            if (canonicalName.equals("Catalina:host=localhost,type=Cluster")) {
                                // Get details of cluster MBeans
                                System.out.println("Cluster MBeans Details:");
                                System.out.println("=========================================");
                                // getMBeansDetails(canonicalName);
                                String canonicalKeyPropList = objectName.getCanonicalKeyPropertyListString();
                                System.out.println(canonicalKeyPropList);
                            }
                        }
                        // ------------------------ system ----------------------
                        ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime");
                        System.out.println("厂商:" + (String) mbsc.getAttribute(runtimeObjName, "VmVendor"));
                        System.out.println("程序:" + (String) mbsc.getAttribute(runtimeObjName, "VmName"));
                        System.out.println("版本:" + (String) mbsc.getAttribute(runtimeObjName, "VmVersion"));
                        Date starttime = new Date((Long) mbsc.getAttribute(runtimeObjName, "StartTime"));
                        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        System.out.println("启动时间:" + df.format(starttime));

                        Long timespan = (Long) mbsc.getAttribute(runtimeObjName, "Uptime");
                        System.out.println("连续工作时间:" + jmx_tomocat.formatTimeSpan(timespan));

                        // ----------------------- JVM -------------------------
                        // 堆使用率
                        ObjectName heapObjName = new ObjectName("java.lang:type=Memory");
                        MemoryUsage heapMemoryUsage = MemoryUsage
                                .from((CompositeDataSupport) mbsc.getAttribute(heapObjName, "HeapMemoryUsage"));
                        long maxMemory = heapMemoryUsage.getMax();// 堆最大
                        System.out.println("heap size:" + maxMemory);
                        long commitMemory = heapMemoryUsage.getCommitted();// 堆当前分配
                        long usedMemory = heapMemoryUsage.getUsed();
                        System.out.println("heap:" + (double) usedMemory * 100 / commitMemory + "%");// 堆使用率

                        MemoryUsage nonheapMemoryUsage = MemoryUsage
                                .from((CompositeDataSupport) mbsc.getAttribute(heapObjName, "NonHeapMemoryUsage"));
                        long noncommitMemory = nonheapMemoryUsage.getCommitted();
                        long nonusedMemory = heapMemoryUsage.getUsed();
                        System.out.println("nonheap:" + (double) nonusedMemory * 100 / noncommitMemory + "%");

                        ObjectName permObjName = new ObjectName("java.lang:type=MemoryPool,name=*Perm*Gen*");
                        Set<ObjectName> sperm = mbsc.queryNames(permObjName, null);
                        for (ObjectName obj : sperm) {
                            ObjectName objname = new ObjectName(obj.getCanonicalName());
                            MemoryUsage permGenUsage = MemoryUsage.from((CompositeDataSupport) mbsc.getAttribute(objname, "Usage"));
                            long committed = permGenUsage.getCommitted();// 持久堆大小
                            long used = heapMemoryUsage.getUsed();//
                            System.out.println("perm gen:" + (double) used * 100 / committed + "%");// 持久堆使用率
                        }

                        // ------------------- Session ---------------
                        ObjectName managerObjName = new ObjectName("Catalina:type=Manager,*");
                        Set<ObjectName> s = mbsc.queryNames(managerObjName, null);
                        for (ObjectName obj : s) {
                            System.out.println("应用名:" + obj.getKeyProperty("path"));
                            ObjectName objname = new ObjectName(obj.getCanonicalName());
                            System.out.println("最大会话数:" + mbsc.getAttribute(objname, "maxActiveSessions"));
                            System.out.println("会话数:" + mbsc.getAttribute(objname, "activeSessions"));
                            System.out.println("活动会话数:" + mbsc.getAttribute(objname, "sessionCounter"));
                        }

                        // ---------------- Thread Pool ----------------
                        ObjectName threadpoolObjName = new ObjectName("Catalina:type=ThreadPool,*");
                        Set<ObjectName> s2 = mbsc.queryNames(threadpoolObjName, null);
                        for (ObjectName obj : s2) {
                            System.out.println("端口名:" + obj.getKeyProperty("name"));
                            ObjectName objname = new ObjectName(obj.getCanonicalName());
                            System.out.println("最大线程数:" + mbsc.getAttribute(objname, "maxThreads"));
                            System.out.println("当前线程数:" + mbsc.getAttribute(objname, "currentThreadCount"));
                            System.out.println("繁忙线程数:" + mbsc.getAttribute(objname, "currentThreadsBusy"));
                        }

        }catch(Exception ee){
            ee.printStackTrace();
        }
    }

    public static String formatTimeSpan(long span) {
        long minseconds = span % 1000;

        span = span / 1000;
        long seconds = span % 60;

        span = span / 60;
        long mins = span % 60;

        span = span / 60;
        long hours = span % 24;

        span = span / 24;
        long days = span;
        return format.format("%1$d天 %2$02d:%3$02d:%4$02d.%5$03d", days, hours, mins, seconds, minseconds).toString();
    }
}   

当然在强大的java中 也自带了图形界面监控tomcat的服务,只需要在cmd命令行输入jvisualvm就可以开启。填上ip和端口即可以通过图形界面监控tomcat了。

上面用到的ftp+FileZille只是我不想用vim模式。而偷的懒而已。各位看官不要在乎~。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自在如风。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值