Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >通过JMX监控weblogic服务

通过JMX监控weblogic服务

作者头像
一笠风雨任生平
发布于 2019-08-02 03:06:31
发布于 2019-08-02 03:06:31
1.9K01
代码可运行
举报
文章被收录于专栏:服务化进程服务化进程
运行总次数:1
代码可运行

一、JMX简介

  JMX是一种JAVA的正式规范,它主要目的是让程序有被管理的功能,那么怎么理解所谓的“被管理”呢?试想你开发了一个软件(如WEB网站),它是在24小时不间断运行的,那么你可能会想要“监控”这个软件的运行情况,比如收到了多少数据,有多少人登录等等。或者你又想“配置”这个软件,比如现在访问人数比较多,你想把数据连接池设置得大一些。

  当然,你也许会专门为这些管理来开发软件,但如果你借助JMX,则会发现创建这样的管理程序是如此简单。因为你无需为管理程序来开发界面,已经有通用的JMX管理软件,如MC4J,或者是用一般都附带提供的HTML网页来管理,你要做的仅仅是将自己要被管理和监控类的按照JMX规范修改一下即可。

  中间件软件WebLogic的管理页面就是基于JMX开发的,而JBoss则整个系统都基于JMX构架。

二、监控Weblogic

下面介绍下如何通过jmx获取监控信息。

1、服务基本信息信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
     * 构造函数
     */
    public WebLogicMiddlewareAdapter(JMXSession jmxSession) {
        currentTime = CommonUtils.getCurrentTime();
        this.jmxSession = jmxSession;
        serverRuntime = (ObjectName) jmxSession.getAttribute(runtimeService, "ServerRuntime");
        applicationRuntimes = (ObjectName[]) jmxSession.getAttribute(serverRuntime, "ApplicationRuntimes");
    }
    
    /**
     * @see com.comtop.numen.monitor.collection.appservice.middleware.adapter.MiddlewareAdapter#getMiddleWareBaseInfomation()
     */
    @Override
    public MiddleWareBaseInfoVO getMiddleWareBaseInfomation() {
        MiddleWareBaseInfoVO objWebLogic = new MiddleWareBaseInfoVO();
        try {
            objWebLogic.setMiddlewareId(CommonUtils.getUUID());
            objWebLogic.setWebContext(this.getWebConext());
            if (JMXConstonts.JMX_COLLECT_EXTENDS.equals(jmxSession.getNodeInfoVO().getIsJmxExtends())) {
                // 获取进程ID
                objWebLogic.setMiddleWarePid(getMiddlewarePID());
            }
            // 服务名称
            objWebLogic.setServerName(jmxSession.getStringAttribute(runtimeService, "ServerName"));
            // Domain名称
            ObjectName objConfig = (ObjectName) jmxSession.getAttribute(runtimeService, "DomainConfiguration");
            objWebLogic.setDomainName(jmxSession.getStringAttribute(objConfig, "Name"));
            String strWLVersion=jmxSession.getStringAttribute(serverRuntime, "WeblogicVersion");
            strWLVersion=strWLVersion.substring(strWLVersion.lastIndexOf("WebLogic"), strWLVersion.length()-1);
            objWebLogic.setRunnningState(jmxSession.getStringAttribute(serverRuntime, "State"));
            objWebLogic.setListenAddress(jmxSession.getStringAttribute(serverRuntime, "ListenAddress"));
            objWebLogic.setListenPort(jmxSession.getStringAttribute(serverRuntime, "ListenPort"));
            objWebLogic.setAdminServerHost(jmxSession.getStringAttribute(serverRuntime, "AdminServerHost"));
            objWebLogic.setAdminServerListenPort(jmxSession.getStringAttribute(serverRuntime, "AdminServerListenPort"));
            objWebLogic.setAdministrationPort(jmxSession.getStringAttribute(serverRuntime, "AdministrationPort"));
            objWebLogic
                .setOpenSocketsCurrentCount(jmxSession.getIntAttribute(serverRuntime, "OpenSocketsCurrentCount"));
            objWebLogic
                .setSocketsOpenedTotalCount(jmxSession.getIntAttribute(serverRuntime, "SocketsOpenedTotalCount"));
            objWebLogic.setRestartsTotalCount(jmxSession.getIntAttribute(serverRuntime, "RestartsTotalCount"));
            objWebLogic.setSSLListenAddress(jmxSession.getStringAttribute(serverRuntime, "SSLListenAddress"));
            long lTime = (Long) jmxSession.getAttribute(serverRuntime, "ActivationTime");
         
        } catch (Exception e) {
            LOGGER.error("采集WebLogic信息出错" + e.getMessage());
            return null;
        }
        return objWebLogic;
    }

2、JDBC信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public JDBCInformationVO getJDBCInfomation() {
        JDBCInformationVO objJDBC = new JDBCInformationVO();
        try {
            List<JDBCDetailVO> lstJdbcDetail = new ArrayList<JDBCDetailVO>();
            List<JDBCInformationVO> lstJdbc = new ArrayList<JDBCInformationVO>();
            String strJdbcId = CommonUtils.getUUID();
            // 获取域配置对象
            ObjectName domainConfig = (ObjectName) jmxSession.getAttribute(runtimeService, "DomainConfiguration");
            ObjectName[] objJDBCSystemResources =
                (ObjectName[]) jmxSession.getAttribute(domainConfig, "JDBCSystemResources");
            ObjectName jdbcSRName = (ObjectName) jmxSession.getAttribute(serverRuntime, "JDBCServiceRuntime");
            ObjectName[] objJDBCDataSource =
                (ObjectName[]) jmxSession.getAttribute(jdbcSRName, "JDBCDataSourceRuntimeMBeans");
            // 定义jdbcUtils对象
            JDBCDetailVO objJDBCdetail = null;
            ObjectName objJdbcResource = null;
            ObjectName objPoolPrms = null;
            for (int i = 0; i < objJDBCDataSource.length; i++) {
                objJDBCdetail = new JDBCDetailVO();
                objJDBCdetail.setDetailId(CommonUtils.getUUID());
                objJDBCdetail.setJdbcId(strJdbcId);
                // 判断JDBCSystemResources对象是否为null
                if (objJDBCSystemResources[i] != null) {
                    objJdbcResource = (ObjectName) jmxSession.getAttribute(objJDBCSystemResources[i], "JDBCResource");
                    objPoolPrms = (ObjectName) jmxSession.getAttribute(objJdbcResource, "JDBCConnectionPoolParams");
                    // 总的连接数
                    objJDBCdetail.setMaxCapacity(jmxSession.getIntAttribute(objPoolPrms, "MaxCapacity"));
                    objJDBCdetail.setIncreseCapacity(jmxSession.getIntAttribute(objPoolPrms, "CapacityIncrement"));
                    objJDBCdetail.setInitCapacity(jmxSession.getIntAttribute(objPoolPrms, "InitialCapacity"));
                    // 数据源名称
                    String objDataSourceName = this.getJndiName(objJdbcResource);
                    if (objDataSourceName == null) {
                        break;
                    }
                    objJDBCdetail.setDataSourceName(objDataSourceName);
                }
                // 最大历史的连接数
                objJDBCdetail.setHisMaxConn(jmxSession.getIntAttribute(objJDBCDataSource[i],
                    "ActiveConnectionsHighCount"));
                // 驱动版本
                objJDBCdetail.setDriverName(jmxSession.getStringAttribute(objJDBCDataSource[i], "VersionJDBCDriver"));
                // 数据源状态
                objJDBCdetail.setDataSourceState(jmxSession.getStringAttribute(objJDBCDataSource[i], "State"));
                // 当前容量
                objJDBCdetail.setCurrCapacity(jmxSession.getIntAttribute(objJDBCDataSource[i], "CurrCapacity"));
                // 当前活动的连接数
                objJDBCdetail.setCurrConnection(jmxSession.getIntAttribute(objJDBCDataSource[i],
                    "ActiveConnectionsCurrentCount"));
                // 数据源泄漏的连接数
                objJDBCdetail.setLeakConn(jmxSession.getIntAttribute(objJDBCDataSource[i], "LeakedConnectionCount"));
                // 当前等待连接数
                objJDBCdetail.setCurrWaitConn(jmxSession.getIntAttribute(objJDBCDataSource[i],
                    "WaitingForConnectionCurrentCount"));
                // 历史等待连接数
                objJDBCdetail.setHisMaxWaitConn(jmxSession.getIntAttribute(objJDBCDataSource[i],
                    "WaitingForConnectionTotal"));
                // 当前可用连接数
                objJDBCdetail.setCurrVailableConn(jmxSession.getIntAttribute(objJDBCDataSource[i], "NumAvailable"));
                // 失败重连数
                objJDBCdetail.setFailReConn(jmxSession
                    .getIntAttribute(objJDBCDataSource[i], "FailuresToReconnectCount"));
            }
            objJDBC.setDetail(lstJdbcDetail);
            objJDBC.setJdbcInfo(lstJdbc);
        } catch (Exception e) {
            LOGGER.error("采集JDBC信息出错" + e.getMessage());
            return null;
        }
        return objJDBC;
    }

3、JVM内存信息以及GC信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public JVMInformationVO getJVMInfomation() {
        JVMInformationVO objJVM = new JVMInformationVO();
        try {
            objJVM.setJvmId(CommonUtils.getUUID());
            ObjectName objName = (ObjectName) jmxSession.getAttribute(serverRuntime, "JVMRuntime");
            // jvm 内存使用情况
            double memoryMaxSize =
                Double.parseDouble(String.valueOf(jmxSession.getAttribute(objName, "HeapSizeCurrent")));
            double memoryFreeSize =
                Double.parseDouble(String.valueOf(jmxSession.getAttribute(objName, "HeapFreeCurrent")));
            // double memoryPer = (memoryMaxSize - memoryFreeSize) / memoryMaxSize * 100;
            objJVM.setJvmHeapTotalSize(String.valueOf(CommonUtils.getDoubleToPattern(memoryMaxSize, 2)));
            objJVM.setJvmHeapUsedSize(String.valueOf(CommonUtils
                .getDoubleToPattern((memoryMaxSize - memoryFreeSize), 2)));
            objJVM.setCreateDate(currentTime);
            objJVM.setNodeId(jmxSession.getNodeInfoVO().getNodeInfoId());
            objName = (ObjectName) jmxSession.getAttribute(serverRuntime, "JVMRuntime");
            objJVM.setJavaVersion(jmxSession.getStringAttribute(objName, "JavaVersion"));
            objJVM.setRunningState(jmxSession.getStringAttribute(serverRuntime, "State"));
            objJVM.setNodeInfoVO(jmxSession.getNodeInfoVO());
            /**************************************
             * 采集扩展信息
             ************************************/
            if (JMXConstonts.JMX_COLLECT_EXTENDS.equals(jmxSession.getNodeInfoVO().getIsJmxExtends())) {
                this.getJVMExtendsInfo(objJVM);
            }
        } catch (Exception e) {
            LOGGER.error("采集JVM内存信息时出错" + e.getMessage());
            return null;
        }
        return objJVM;
    }
    
    /**
     * 获取GC信息
     * 
     * @param strName
     * @param session
     * @param objVO
     * @return
     */
    public Map<String, String[]> getGCInfo(String[] strName, JMXSession session, JVMInformationVO objVO) {
        Map<String, String[]> objGCMap = new HashMap<String, String[]>(5);
        ObjectName objGc = null;
        try {
            objGc = new ObjectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + ",*");
            Set<ObjectName> mbeans = session.getConnection().queryNames(objGc, null);
            ObjectName objName = null;
            StringBuffer strGcCount = new StringBuffer(512);
            if (mbeans != null) {
                Iterator<ObjectName> iterator = mbeans.iterator();
                while (iterator.hasNext()) {
                    objName = (ObjectName) iterator.next();
                    String objGCName = session.getStringAttribute(objName, "Name");
                    String objGCCount = session.getStringAttribute(objName, "CollectionCount");
                    String objGCTime = session.getStringAttribute(objName, "CollectionTime");
                    strGcCount.append(objGCName).append(":").append(objGCCount).append(",");
                    Object[] objGC = (Object[]) session.getAttribute(objName, "MemoryPoolNames");
                    for (int i = 0; i < objGC.length; i++) {
                        if (objGCMap.get(objGC[i].toString()) == null) {
                            objGCMap.put(objGC[i].toString(), new String[] { objGCName, objGCTime });
                        } else {
                            String strTempName = objGCMap.get(objGC[i].toString())[0] + "," + objGCName;
                            String strTempTime = objGCMap.get(objGC[i].toString())[1] + "," + objGCCount;
                            objGCMap.put(objGC[i].toString(), new String[] { strTempName, strTempTime });
                        }
                    }
                }
                if (strGcCount.length() > 0) {
                    strGcCount.deleteCharAt(strGcCount.length() - 1);
                }
                objVO.setJvmMemGcCount(strGcCount.toString());
            }
        } catch (Exception e) {
            LOGGER.error("获取GC信息时出错" + e.getMessage());
            return null;
        }
        return objGCMap;
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
     * 获取JVM扩展信息
     * 
     * @param objJVM
     */
    public void getJVMExtendsInfo(JVMInformationVO objJVM) {
        List<JVMDetailVO> lstJVMDetail = new ArrayList<JVMDetailVO>(10);
        try {
            /***************** JVM版本 ****************/
            ObjectName objName = new ObjectName("java.lang:type=Runtime");
            String strVMName = jmxSession.getStringAttribute(objName, "VmName");
            String strVMVersion = jmxSession.getStringAttribute(objName, "VmVersion");
            objJVM.setJvmVersion(strVMName + strVMVersion);
            String strJVMArg =
                JMXTransformHelp.transformArrayToString(jmxSession.getAttribute(objName, "InputArguments"));
            strJVMArg = strJVMArg != null && strJVMArg.length() > 2000 ? strJVMArg.substring(0, 1999) : strJVMArg;
            objJVM.setJvmArguments(strJVMArg);
            
            /***************** 内存回收情况 ****************/
            Map<String, String[]> objGCMap = this.getGCInfo(JMXConstonts.GC_STRATEGY, jmxSession, objJVM);
            
            /***************** 内存分区情况 ****************/
            ObjectName poolName = null;
            try {
                poolName = new ObjectName(MEMORY_POOL_MXBEAN_DOMAIN_TYPE + ",*");
            } catch (MalformedObjectNameException e) {
            }
            Set<ObjectName> mbeans = jmxSession.getConnection().queryNames(poolName, null);
            if (mbeans != null) {
                Iterator<ObjectName> iterator = mbeans.iterator();
                JVMDetailVO objDetailVO = null;
                while (iterator.hasNext()) {
                    objDetailVO = new JVMDetailVO();
                    objName = (ObjectName) iterator.next();
                    MemoryUsage objUsage =
                        MemoryUsage.from((CompositeDataSupport) jmxSession.getAttribute(objName, "Usage"));
                    objDetailVO.setJvmDetailId(CommonUtils.getUUID());
                    objDetailVO.setJvmId(objJVM.getJvmId());
                    if (objUsage != null) {
                        objDetailVO.setJvmMemCommitted(objUsage.getCommitted());
                        objDetailVO.setJvmMemInit(objUsage.getInit());
                        objDetailVO.setJvmMemMax(objUsage.getMax());
                        objDetailVO.setJvmMemUsed(objUsage.getUsed());
                    }
                    objDetailVO.setJvmMemName(jmxSession.getStringAttribute(objName, "Name"));
                    objDetailVO.setJvmMemType(jmxSession.getStringAttribute(objName, "Type"));
                    if (objGCMap.get(objDetailVO.getJvmMemName()) != null) {
                        objDetailVO.setJvmMemGcStrategy(objGCMap.get(objDetailVO.getJvmMemName())[0]);
                        objDetailVO.setJvmMemGcTime(objGCMap.get(objDetailVO.getJvmMemName())[1]);
                    }
                    lstJVMDetail.add(objDetailVO);
                }
            }
            objJVM.setDetail(lstJVMDetail);
        } catch (Exception e) {
            LOGGER.error("获取JVM扩展信息出错" + e.getMessage());
        }
    }

4、线程队列信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public ThreadInformationVO getThreadQueueInfomation() {
        ThreadInformationVO objThreadQueue = new ThreadInformationVO();
        // 线程对象
        ObjectName objThreadPool = null;
        try {
            String strThreadId = CommonUtils.getUUID();
            objThreadPool = (ObjectName) jmxSession.getAttribute(serverRuntime, "ThreadPoolRuntime");
            // 线程吞吐量
            objThreadQueue.setThroughput(jmxSession.getStringAttribute(objThreadPool, "Throughput"));
            // 队列长度
            objThreadQueue.setQueueLength(jmxSession.getIntAttribute(objThreadPool, "QueueLength"));
            // 执行线程总数
            objThreadQueue.setExeThreadTotalCount(jmxSession.getIntAttribute(objThreadPool, "ExecuteThreadTotalCount"));
            // 待命的线程数
            objThreadQueue.setStandbyThreadCount(jmxSession.getIntAttribute(objThreadPool, "StandbyThreadCount"));
            // 活动线程数
            objThreadQueue.setActiveExeThreadCount(objThreadQueue.getExeThreadTotalCount()
                - objThreadQueue.getStandbyThreadCount());
            HealthState objState = (HealthState) jmxSession.getAttribute(objThreadPool, "HealthState");
            objThreadQueue.setHealth(String.valueOf(objState.getState()));
            // 等待的用户请求数
            objThreadQueue.setPendingRequestCount(jmxSession.getIntAttribute(objThreadPool, "PendingUserRequestCount"));
            // 占用的线程数
            objThreadQueue.setHoggingThreadsCount(jmxSession.getIntAttribute(objThreadPool, "HoggingThreadCount"));
            objThreadQueue.setCreateDate(currentTime);
            objThreadQueue.setNodeId(jmxSession.getNodeInfoVO().getNodeInfoId());
            objThreadQueue.setThreadId(strThreadId);
            /**************** get stuck threads ******/
            ExecuteThread[] objExecuteThreadsList =
                (ExecuteThread[]) jmxSession.getAttribute(objThreadPool, "ExecuteThreads");
            if (objExecuteThreadsList == null || objExecuteThreadsList.length == 0) {
                objThreadQueue.setStuckThreadsCount(0);
                return objThreadQueue;
            }
            List<ThreadDetailVO> lstStuckDetail = getStuckThreadList(objExecuteThreadsList, strThreadId);
            objThreadQueue.setDetail(lstStuckDetail);
            objThreadQueue.setStuckThreadsCount(lstStuckDetail.size());
        } catch (Exception e) {
            LOGGER.error("采集线程队列时出错" + e.getMessage());
            return null;
        }
        return objThreadQueue;
    }
    
    /**
     * 获取进程ID
     * 
     * @return strPID
     */
    
    /**
     * 获取stuck线程
     * 
     * @param objExecuteThreadsList
     * @param threadId
     * @return List<ThreadDetailVO>
     */
    private List<ThreadDetailVO> getStuckThreadList(ExecuteThread[] objExecuteThreadsList, String threadId) {
        List<ThreadDetailVO> lstDetail = new ArrayList<ThreadDetailVO>();
        ExecuteThread objThread = null;
        String strName = null; // 线程名称
        // 当前请求的request内容
        String strCurrentRequest = "";
        String strIsStuck = null; // 是否阻塞
        boolean bIsStuck = false;
        ThreadDetailVO objDetail = null;
        StackTraceElement[] strThreadInfo = null;
        StringBuilder strStackTrace = null;
        for (int i = 0; i < objExecuteThreadsList.length; i++) {
            objThread = objExecuteThreadsList[i];
            strIsStuck = String.valueOf(objThread.isStuck());
            bIsStuck = strIsStuck != null ? Boolean.parseBoolean(strIsStuck) : false;
            if (bIsStuck) {
                strName = objThread.getName();
                objDetail = new ThreadDetailVO();
                objDetail.setThreadName(strName != null ? strName : "");
                strCurrentRequest = objThread.getCurrentRequest();
                if (strCurrentRequest != null && strCurrentRequest.length() > 4000) {
                    strCurrentRequest = strCurrentRequest.substring(0, 4000);
                }
                objDetail.setCurrentRequest(strCurrentRequest);
                objDetail.setCurrentRequestUri(JMXTransformHelp.getCurrentRequestUrlFromThread(strCurrentRequest));
                objDetail.setThreadExeTime(System.currentTimeMillis() - objThread.getCurrentRequestStartTime());
                // 线程堆栈信息
                if (objThread.getExecuteThread() != null) {
                    strThreadInfo = objThread.getExecuteThread().getStackTrace();
                }
                strStackTrace = new StringBuilder(1024);
                if (strThreadInfo != null) {
                    for (final StackTraceElement stackTraceElement : strThreadInfo) {
                        strStackTrace.append(JMXTransformHelp.htmlEncode(stackTraceElement.toString(), true)).append(
                            "<br/>");
                    }
                }
                objDetail.setStackInfo(strStackTrace.toString());
                objDetail.setDetailId(CommonUtils.getUUID());
                objDetail.setThreadId(threadId);
                lstDetail.add(objDetail);
            }
        }
        return lstDetail;
    }

5、JMS信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public JmsInformationVO getJmsInfomation() {
        JmsInformationVO objJmsInfo = new JmsInformationVO();
        ObjectName objName = (ObjectName) jmxSession.getAttribute(serverRuntime, "JMSRuntime");
        objJmsInfo.setJmsId(CommonUtils.getUUID());
        objJmsInfo.setServiceNodeId(jmxSession.getNodeInfoVO().getNodeInfoId());
        objJmsInfo.setCreateDate(currentTime);
        objJmsInfo.setConnectionsCurrentCount(jmxSession.getIntAttribute(objName, "ConnectionsCurrentCount"));
        objJmsInfo.setConnectionsHighCount(jmxSession.getIntAttribute(objName, "ConnectionsHighCount"));
        objJmsInfo.setConnectionsTotalCount(jmxSession.getIntAttribute(objName, "ConnectionsTotalCount"));
        objJmsInfo.setServersCurrentCount(jmxSession.getIntAttribute(objName, "JMSServersCurrentCount"));
        objJmsInfo.setServersHighCount(jmxSession.getIntAttribute(objName, "JMSServersHighCount"));
        objJmsInfo.setServersTotalCount(jmxSession.getIntAttribute(objName, "JMSServersTotalCount"));
        HealthState objState = (HealthState) jmxSession.getAttribute(objName, "HealthState");
        objJmsInfo.setHealthState(String.valueOf(objState.getState()));
        ObjectName[] objServers = (ObjectName[]) jmxSession.getAttribute(objName, "JMSServers");
        if (objServers != null) {
            List<JmsDetailVO> lstJmsDetailVO = new ArrayList<JmsDetailVO>();
            JmsDetailVO objDetail = null;
            for (int i = 0; i < objServers.length; i++) {
                objDetail = new JmsDetailVO();
                objDetail.setJmsId(objJmsInfo.getJmsId());
                objDetail.setJmsDetailId(CommonUtils.getUUID());
                objDetail.setJmsName(jmxSession.getStringAttribute(objServers[i], "Name"));
                objDetail.setBytesCurrentCount(jmxSession.getIntAttribute(objServers[i], "BytesCurrentCount"));
                objDetail.setBytesHighCount(jmxSession.getIntAttribute(objServers[i], "BytesHighCount"));
                objDetail.setBytesPendingCount(jmxSession.getIntAttribute(objServers[i], "BytesPendingCount"));
                objDetail.setBytesReceivedCount(jmxSession.getIntAttribute(objServers[i], "BytesReceivedCount"));
                objDetail.setDestinationsCurrentCount(jmxSession.getIntAttribute(objServers[i],
                    "DestinationsCurrentCount"));
                objDetail.setDestinationsHighCount(jmxSession.getIntAttribute(objServers[i], "DestinationsHighCount"));
                objDetail
                    .setDestinationsTotalCount(jmxSession.getIntAttribute(objServers[i], "DestinationsTotalCount"));
                objDetail.setMessagesCurrentCount(jmxSession.getIntAttribute(objServers[i], "MessagesCurrentCount"));
                objDetail.setMessagesHighCount(jmxSession.getIntAttribute(objServers[i], "MessagesHighCount"));
                objDetail.setMessagesPendingCount(jmxSession.getIntAttribute(objServers[i], "MessagesPendingCount"));
                objDetail.setMessagesReceivedCount(jmxSession.getIntAttribute(objServers[i], "MessagesReceivedCount"));
                objDetail.setSessionPoolsCurrentCount(jmxSession.getIntAttribute(objServers[i],
                    "SessionPoolsCurrentCount"));
                objDetail.setSessionPoolsHighCount(jmxSession.getIntAttribute(objServers[i], "SessionPoolsHighCount"));
                objDetail
                    .setSessionPoolsTotalCount(jmxSession.getIntAttribute(objServers[i], "SessionPoolsTotalCount"));
                objState = (HealthState) jmxSession.getAttribute(objName, "HealthState");
                objDetail.setHealthState(String.valueOf(objState.getState()));
                lstJmsDetailVO.add(objDetail);
            }
            objJmsInfo.setLstDetail(lstJmsDetailVO);
        }
        return objJmsInfo;
    }

6、获取EJB信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public List<EjbInformationVO> getEjbInformation() {
        List<EjbInformationVO> lstEjb = new ArrayList<EjbInformationVO>();
        for (int i = 4; i < applicationRuntimes.length; i++) {
            ObjectName[] objComponent =
                (ObjectName[]) jmxSession.getAttribute(applicationRuntimes[i], "ComponentRuntimes");
            if (objComponent == null) {
                continue;
            }
            for (int j = 0; j < objComponent.length; j++) {
                if (objComponent[j] == null || !objComponent[j].getKeyPropertyListString().contains("EJB")) {
                    continue;
                }
                ObjectName[] objEjbRuntime = (ObjectName[]) jmxSession.getAttribute(objComponent[j], "EJBRuntimes");
                if (objEjbRuntime == null) {
                    continue;
                }
                for (int k = 0; k < objEjbRuntime.length; k++) {
                    EjbInformationVO objEjbVO = new EjbInformationVO();
                    objEjbVO.setServiceNodeId(jmxSession.getNodeInfoVO().getNodeInfoId());
                    objEjbVO.setStatus(jmxSession.getStringAttribute(objEjbRuntime[k], "DeploymentState"));
                    objEjbVO.setEjbId(CommonUtils.getUUID());
                    objEjbVO.setCreateDate(currentTime);
                    objEjbVO.setEjbName(jmxSession.getStringAttribute(objEjbRuntime[k], "EJBName"));
                    ObjectName objEntry = objEjbRuntime[k];
                    
                    ObjectName objRuntime = (ObjectName) jmxSession.getAttribute(objEntry, "PoolRuntime");
                    if (objRuntime == null) {
                        continue;
                    }
                    double dDestroyedTotalCount = jmxSession.getDoubleAttribute(objRuntime, "DestroyedTotalCount");
                    double dMissTotalCount = jmxSession.getDoubleAttribute(objRuntime, "MissTotalCount");
                    double dAccessTotalCount = jmxSession.getDoubleAttribute(objRuntime, "AccessTotalCount");
                    double dTimeoutTotalCount = jmxSession.getDoubleAttribute(objRuntime, "TimeoutTotalCount");
                    // 已破坏 Bean 比率
                    objEjbVO.setDestroyedBeanRatio(CommonUtils.divideDataToString(dDestroyedTotalCount,
                        dAccessTotalCount, 2));
                    // 缓冲池丢失比率
                    objEjbVO.setCachePoolMissRatio(CommonUtils
                        .divideDataToString(dMissTotalCount, dAccessTotalCount, 2));
                    // 缓冲池超时比率
                    objEjbVO.setCachePoolTimeoutRatio(CommonUtils.divideDataToString(dTimeoutTotalCount,
                        dAccessTotalCount, 2));
                    // objRuntime = (ObjectName) jmxSession.getAttribute(objEntry, "CacheRuntime");
                    // // 缓存丢失比率 =(缓存丢失总数/缓存访问总数)* 100
                    // double dCacheMissCount = jmxSession.getDoubleAttribute(objRuntime, "CacheMissCount");
                    // double dActivationCount = jmxSession.getDoubleAttribute(objRuntime, "ActivationCount");
                    // objEjbVO.setCachedMissRatio(CommonUtils.divideDataToString(dCacheMissCount, dActivationCount,
                    // 2));
                    // objRuntime = (ObjectName) jmxSession.getAttribute(objEntry, "LockingRuntime");
                    // // 锁定等待程序比率
                    // // Lock Timeout Ratio =(Lock Manager Timeout Total Count / Lock Manager Total Access Count) * 100
                    // double dWaiterCurrentCount = jmxSession.getDoubleAttribute(objRuntime, "WaiterCurrentCount");
                    // double dLockCurrentCount = jmxSession.getDoubleAttribute(objRuntime, "LockEntriesCurrentCount");
                    // objEjbVO.setLockWaitRatio(CommonUtils.divideDataToString(dWaiterCurrentCount, dLockCurrentCount,
                    // 2));
                    // // Lock Timeout Ratio =(Lock Manager Timeout Total Count / Lock Manager Total Access Count) * 100
                    // // 锁定超时比率
                    // double dLockManagerAccessCount = jmxSession.getDoubleAttribute(objRuntime,
                    // "LockManagerAccessCount");
                    // dTimeoutTotalCount = jmxSession.getDoubleAttribute(objRuntime, "TimeoutTotalCount");
                    // objEjbVO.setLockTimeoutRatio(CommonUtils.divideDataToString(dTimeoutTotalCount,
                    // dLockManagerAccessCount, 2));
                    //                    
                    objRuntime = (ObjectName) jmxSession.getAttribute(objEntry, "TransactionRuntime");
                    double dTranCommTotalCount =
                        jmxSession.getDoubleAttribute(objRuntime, "TransactionsCommittedTotalCount");
                    double dTranRollBackCount =
                        jmxSession.getDoubleAttribute(objRuntime, "TransactionsRolledBackTotalCount");
                    double dTranTimeOutTotalCount =
                        jmxSession.getDoubleAttribute(objRuntime, "TransactionsTimedOutTotalCount");
                    // 事务回滚比率
                    objEjbVO.setTransactionRollBackRatio(CommonUtils.divideDataToString(dTranRollBackCount,
                        dTranCommTotalCount, 2));
                    // 事务超时比率
                    objEjbVO.setTransactionTimeoutRatio(CommonUtils.divideDataToString(dTranTimeOutTotalCount,
                        dTranCommTotalCount, 2));
                    lstEjb.add(objEjbVO);
                }
            }
        }
        return lstEjb;
    }

如果还有其他需求可以查看http://edocs.weblogicfans.net/wls/docs92/jmx/index.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
中间件的数据抽取各种运行状态 ,weblogic的 , tomcat 类似 ---朋友的代码
package com.agent.opt.type.weblogic.data; import java.io.File; import java.io.IOException; import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.MalformedURLException; import java.ne
allsmallpig
2021/02/25
5670
Z大牛 | Zabbix通过JMX监控java中间件
周松,长期从事在ITOM、ITOA领域,拥有丰富的IT系统管理和监控实施经验,精通Zabbix开源监控系统的架构、部署、使用和维护;精通IBM Tivoli、BMC Patrol等商业软件产品
Zabbix
2021/02/03
3.1K1
在?进来看看怎么攻击JMX呗
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。狭隘的理解,我们可以通过JMX管理、监视我们的java程序。但是不是所有java程序都能被管理,只有通过特定实现的java才能够被管理,这种特定实现机制就是Mbean。
tnt阿信
2020/08/05
6230
在?进来看看怎么攻击JMX呗
JAVA安全之JMX攻防研究分析
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架,JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用,我们可以将JMX理解为一个服务器,它能让客户端远程访问该服务器上运行的JAVA程序的API并通过相应的函数对该程序进行增删改查,运维人员常部署Zabbix、Cacti和Nagios对Tomcat、Weblogic等服务器进行监控时通常都是通过JMX访问Tomcat、Weblogic的方式实现,然后通过JVM的queryMBeans方法查询获取具体的Mbean(Thread、JVM、JDBC),根据Bean的属性值判断运行状态,本篇文章我们注意介绍JMX的相关基础知识以及风险点和攻击方式
Al1ex
2024/12/20
1290
JAVA安全之JMX攻防研究分析
Prometheus监控有所思:多标签埋点及Mbean
使用 grafana+prometheus+jmx 作为普通的监控手段,是比较有用的。我之前的文章介绍了相应的实现办法。https://www.cnblogs.com/yougewe/p/11140129.html
烂猪皮
2021/04/02
1.4K0
JMX in action第二篇
其实一看到Dynamic这个词就基本上确定了,就是反射那一套,不外乎属性获取,设定,方法调用等等,但是这个在使用中是至关重要的,因为现有系统如果都想把接口改造成符合Standard MBean方式的,不太现实,而利用DynamicMBean,通过反射将需要管理的Bean动态生成,对现有系统减少侵入性,也减少了问题产生的可能。来看看DynamicMBean接口
Dylan Liu
2019/07/01
3780
Mybatis 解析 SQL 源码分析一
在使用 Mybatis 的时候,我们在 Mapper.xml 配置文件中书写 SQL;文件中还配置了对应的dao,SQL 中还可以使用一些诸如for循环,if判断之类的高级特性,当数据库列和JavaBean属性不一致时定义的 resultMap等,接下来就来看下Mybatis 是如何从配置文件中解析出 SQL 并把用户传的参数进行绑定;
Java技术编程
2020/05/21
6690
tomcat源码解读三(1) tomcat的jmx管理
    JMX即Java 管理扩展(Java Management Extensions,JMX)用来管理检测 Java 程序(同时 JMX 也在 J2EE 1.4 中被发布)它的作用是可以在程序运行的时候对其进行动态处理,调用相应方法来进行对指定属性值进行修改,在下面我将以代码结合jconsole进行分析(注意:在实际的程序管理过程中并不支持使用jconsole,因为它是一个java的客户端)源代码在下一节进行分析 1.1 tomcat中JMX的使用Demo     请注意这个JMX的展示仅仅针对与tom
cfs
2018/03/08
7440
tomcat源码解读三(1) tomcat的jmx管理
【Tomcat】《How Tomcat Works》英文版GPT翻译(第二十章)
Chapter 19 discussed the Manager application. It showed that the ManagerServlet class implemented the ContainerServlet interface to get access to Catalina internal objects. This chapter now shows that managing Tomcat can be achieved more sophisticatedly using the Java Management Extensions (the JMX specification). For those unfamiliar with JMX, a brief introduction is given at the beginning of the chapter. In addition, this chapter explains the Commons Modeler library that Catalina uses to ease the task of writing Managed Beans, the objects used for managing other objects. Examples are offered to make understanding the use of JMX in Tomcat easier.
阿东
2024/02/06
1620
【Tomcat】《How Tomcat Works》英文版GPT翻译(第二十章)
【性能优化】小伙伴问我性能指标监控怎么做,这次我安排上了!!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/10/29
4990
【性能优化】小伙伴问我性能指标监控怎么做,这次我安排上了!!
tomcat源码解读三(2) tomcat中JMX的源码分析
     在这里我是将tomcat中的jmx给拆分出来进行单独分析,希望通过此种方式能够尽可能的出现更多的问题,以便对其有更多的了解,首先需要声明的是tomcat的JMX是在jsvase原有的基础上做
cfs
2018/03/08
1.3K0
tomcat源码解读三(2) tomcat中JMX的源码分析
如何自己监控java
java自带的java.lang.management.ManagementFactory 可以看到它提供的一些列方法:
爬蜥
2019/07/09
1.5K0
JMX远程代码漏洞研究
前一段时间apace solr JMX因为配置不当出现远程代码执行漏洞,最近自己在看一套java系统时,发现该系统也存在JMX远程代码漏洞,于是乎就想研究下JMX这种通用型漏洞,下面我就从原理到利用对该漏洞做一个简单的梳理。
FB客服
2020/04/14
2.6K0
JMX远程代码漏洞研究
聊聊kafka consumer offset lag的监控
在0.8.2.2版本如下 kafka_2.10-0.8.2.2-sources.jar!/kafka/tools/ConsumerOffsetChecker.scala
code4it
2018/09/17
2.1K0
老技术新谈,Java应用监控利器JMX(1)
The Java Management Extensions (JMX) API is a standard API for management and monitoring of resources such as applications, devices, services, and the Java virtual machine. The JMX technology was developed through the Java Community Process (JCP) as Java Specification Request (JSR) 3, Java Management Extensions, and JSR 160, JMX Remote API.——摘自官网定义。
一猿小讲
2019/08/23
7850
老技术新谈,Java应用监控利器JMX(1)
Kafka(0.11.0.2版本)堆内存不能正常回收问题分析【实战笔记】
短信报警堆内存GC后依然超过4G内存,跟上篇文章所说情况相同。只是上次情况告警短信没发出来。这次介入前,dump了该节点的堆照,方便定位引起的问题。 告警GC日志,回收后依然在4G内存,回收前后只减少了几百M。
瓜农老梁
2019/08/30
1.4K0
一个Android 蓝牙GATT数据读写的小应用
2、服务特征UUID/读特征UUID 配置特征UUID/写特征UUID,这几个特征UUID 最好是找厂家确认。
呱牛笔记
2024/03/24
3670
Kafka监控框架介绍
CMAK(原Kafka Manager) 是雅虎公司于 2015 年开源的一个 Kafka 监控框架。这个框架用 Scala 语言开发而成,主要用于管理和监控 Kafka 集群。github地址:https://github.com/yahoo/CMAK ,安装前提要求Java版本在11以上。
Se7en258
2021/05/18
1.3K0
Kafka监控框架介绍
使用 java.lang.management 包监控 java 虚拟机
对 java 来说,jvm 的监控是工程应用中十分重要的一环,无论是日常的性能优化还是异常处理都离不开监控数据的分析。 java 的 java.lang.management 包提供了用于监控和管理 java 虚拟机及虚拟机各项指标的接口。
用户3147702
2022/06/27
7020
【Java框架型项目从入门到装逼】第十节 simple-jdbc源码
这一节就简单贴一下simple-jdbc框架的源码,其实也没多少东西,都很简单的啦。这个小框架就是对之前 文章发布系统博客 中封装的jdbc工具类,进行的一个强化。 目录结构: 1、DBCP_sour
剽悍一小兔
2018/05/17
7430
相关推荐
中间件的数据抽取各种运行状态 ,weblogic的 , tomcat 类似 ---朋友的代码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验