364 lines · 13.2 KB · Java
RawDownload
/* * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.  Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */package sun.management.snmp.jvminstr; // java imports//import java.io.Serializable; import java.lang.management.ThreadMXBean;import java.lang.management.ManagementFactory; // jmx imports//import javax.management.MBeanServer;import com.sun.jmx.snmp.SnmpString;import com.sun.jmx.snmp.SnmpStatusException; // jdmk imports//import com.sun.jmx.snmp.agent.SnmpMib;import com.sun.jmx.snmp.SnmpDefinitions; import sun.management.snmp.jvmmib.JvmThreadingMBean;import sun.management.snmp.jvmmib.EnumJvmThreadCpuTimeMonitoring;import sun.management.snmp.jvmmib.EnumJvmThreadContentionMonitoring;import sun.management.snmp.util.MibLogger; /** * The class is used for implementing the "JvmThreading" group. */public class JvmThreadingImpl implements JvmThreadingMBean {     /**     * Variable for storing the value of "JvmThreadCpuTimeMonitoring".     *     * "The state of the Thread CPU Time Monitoring feature.     * This feature can be:     *     * unsupported: The JVM does not support Thread CPU Time Monitoring.     * enabled    : The JVM supports Thread CPU Time Monitoring, and it     * is enabled.     * disabled   : The JVM supports Thread CPU Time Monitoring, and it     * is disabled.     *     * Only enabled(3) and disabled(4) may be supplied as values to a     * SET request. unsupported(1) can only be set internally by the     * agent.     *     * See java.lang.management.ThreadMXBean.isThreadCpuTimeSupported(),     * java.lang.management.ThreadMXBean.isThreadCpuTimeEnabled(),     * java.lang.management.ThreadMXBean.setThreadCpuTimeEnabled()     * "     *     */    final static EnumJvmThreadCpuTimeMonitoring        JvmThreadCpuTimeMonitoringUnsupported =        new EnumJvmThreadCpuTimeMonitoring("unsupported");    final static EnumJvmThreadCpuTimeMonitoring        JvmThreadCpuTimeMonitoringEnabled =        new EnumJvmThreadCpuTimeMonitoring("enabled");    final static EnumJvmThreadCpuTimeMonitoring        JvmThreadCpuTimeMonitoringDisabled =        new EnumJvmThreadCpuTimeMonitoring("disabled");      /**     * Variable for storing the value of "JvmThreadContentionMonitoring".     *     * "The state of the Thread Contention Monitoring feature.     * This feature can be:     *     * unsupported: The JVM does not support Thread Contention Monitoring.     * enabled    : The JVM supports Thread Contention Monitoring, and it     * is enabled.     * disabled   : The JVM supports Thread Contention Monitoring, and it     * is disabled.     *     * Only enabled(3) and disabled(4) may be supplied as values to a     * SET request. unsupported(1) can only be set internally by the     * agent.     *     * See java.lang.management.ThreadMXBean.isThreadContentionMonitoringSupported(),     * java.lang.management.ThreadMXBean.isThreadContentionMonitoringEnabled(),     * java.lang.management.ThreadMXBean.setThreadContentionMonitoringEnabled()     * "     *     */    static final EnumJvmThreadContentionMonitoring        JvmThreadContentionMonitoringUnsupported =        new EnumJvmThreadContentionMonitoring("unsupported");    static final EnumJvmThreadContentionMonitoring        JvmThreadContentionMonitoringEnabled =        new EnumJvmThreadContentionMonitoring("enabled");    static final EnumJvmThreadContentionMonitoring        JvmThreadContentionMonitoringDisabled =        new EnumJvmThreadContentionMonitoring("disabled");     /**     * Constructor for the "JvmThreading" group.     * If the group contains a table, the entries created through an SNMP SET     * will not be registered in Java DMK.     */    public JvmThreadingImpl(SnmpMib myMib) {        log.debug("JvmThreadingImpl","Constructor");    }      /**     * Constructor for the "JvmThreading" group.     * If the group contains a table, the entries created through an SNMP SET     * will be AUTOMATICALLY REGISTERED in Java DMK.     */    public JvmThreadingImpl(SnmpMib myMib, MBeanServer server) {        log.debug("JvmThreadingImpl","Constructor with server");    }     /**     * ThreadMXBean accessor. It is acquired from the     * java.lang.management.ManagementFactory     * @return The local ThreadMXBean.     */    static ThreadMXBean getThreadMXBean() {        return ManagementFactory.getThreadMXBean();    }     /**     * Getter for the "JvmThreadCpuTimeMonitoring" variable.     */    public EnumJvmThreadCpuTimeMonitoring getJvmThreadCpuTimeMonitoring()        throws SnmpStatusException {         ThreadMXBean mbean = getThreadMXBean();         if(!mbean.isThreadCpuTimeSupported()) {            log.debug("getJvmThreadCpuTimeMonitoring",                      "Unsupported ThreadCpuTimeMonitoring");            return JvmThreadCpuTimeMonitoringUnsupported;        }         try {            if(mbean.isThreadCpuTimeEnabled()) {                log.debug("getJvmThreadCpuTimeMonitoring",                      "Enabled ThreadCpuTimeMonitoring");                return JvmThreadCpuTimeMonitoringEnabled;            } else {                log.debug("getJvmThreadCpuTimeMonitoring",                          "Disabled ThreadCpuTimeMonitoring");                return JvmThreadCpuTimeMonitoringDisabled;            }        }catch(UnsupportedOperationException e) {            log.debug("getJvmThreadCpuTimeMonitoring",                      "Newly unsupported ThreadCpuTimeMonitoring");             return JvmThreadCpuTimeMonitoringUnsupported;        }    }     /**     * Setter for the "JvmThreadCpuTimeMonitoring" variable.     */    public void setJvmThreadCpuTimeMonitoring(EnumJvmThreadCpuTimeMonitoring x)        throws SnmpStatusException {         ThreadMXBean mbean = getThreadMXBean();         // We can trust the received value, it has been checked in        // checkJvmThreadCpuTimeMonitoring        if(JvmThreadCpuTimeMonitoringEnabled.intValue() == x.intValue())            mbean.setThreadCpuTimeEnabled(true);        else            mbean.setThreadCpuTimeEnabled(false);    }     /**     * Checker for the "JvmThreadCpuTimeMonitoring" variable.     */    public void checkJvmThreadCpuTimeMonitoring(EnumJvmThreadCpuTimeMonitoring                                                x)        throws SnmpStatusException {         //Can't be set externaly to unsupported state.        if(JvmThreadCpuTimeMonitoringUnsupported.intValue() == x.intValue()) {             log.debug("checkJvmThreadCpuTimeMonitoring",                      "Try to set to illegal unsupported value");            throw new SnmpStatusException(SnmpDefinitions.snmpRspWrongValue);        }         if ((JvmThreadCpuTimeMonitoringEnabled.intValue() == x.intValue()) ||            (JvmThreadCpuTimeMonitoringDisabled.intValue() == x.intValue())) {             // The value is a valid value. But is the feature supported?            ThreadMXBean mbean = getThreadMXBean();            if(mbean.isThreadCpuTimeSupported()) return;             // Not supported.            log.debug("checkJvmThreadCpuTimeMonitoring",                      "Unsupported operation, can't set state");            throw new                SnmpStatusException(SnmpDefinitions.snmpRspInconsistentValue);        }         // Unknown value.        log.debug("checkJvmThreadCpuTimeMonitoring",                  "unknown enum value ");        throw new SnmpStatusException(SnmpDefinitions.snmpRspWrongValue);    }     /**     * Getter for the "JvmThreadContentionMonitoring" variable.     */    public EnumJvmThreadContentionMonitoring getJvmThreadContentionMonitoring()        throws SnmpStatusException {         ThreadMXBean mbean = getThreadMXBean();         if(!mbean.isThreadContentionMonitoringSupported()) {            log.debug("getJvmThreadContentionMonitoring",                      "Unsupported ThreadContentionMonitoring");            return JvmThreadContentionMonitoringUnsupported;        }         if(mbean.isThreadContentionMonitoringEnabled()) {            log.debug("getJvmThreadContentionMonitoring",                      "Enabled ThreadContentionMonitoring");            return JvmThreadContentionMonitoringEnabled;        } else {            log.debug("getJvmThreadContentionMonitoring",                      "Disabled ThreadContentionMonitoring");            return JvmThreadContentionMonitoringDisabled;        }    }     /**     * Setter for the "JvmThreadContentionMonitoring" variable.     */    public void setJvmThreadContentionMonitoring(                            EnumJvmThreadContentionMonitoring x)        throws SnmpStatusException {        ThreadMXBean mbean = getThreadMXBean();         // We can trust the received value, it has been checked in        // checkJvmThreadContentionMonitoring        if(JvmThreadContentionMonitoringEnabled.intValue() == x.intValue())            mbean.setThreadContentionMonitoringEnabled(true);        else            mbean.setThreadContentionMonitoringEnabled(false);    }     /**     * Checker for the "JvmThreadContentionMonitoring" variable.     */    public void checkJvmThreadContentionMonitoring(                              EnumJvmThreadContentionMonitoring x)        throws SnmpStatusException {        //Can't be set externaly to unsupported state.        if(JvmThreadContentionMonitoringUnsupported.intValue()==x.intValue()) {            log.debug("checkJvmThreadContentionMonitoring",                      "Try to set to illegal unsupported value");            throw new SnmpStatusException(SnmpDefinitions.snmpRspWrongValue);        }         if ((JvmThreadContentionMonitoringEnabled.intValue()==x.intValue()) ||            (JvmThreadContentionMonitoringDisabled.intValue()==x.intValue())) {             // The value is valid, but is the feature supported ?            ThreadMXBean mbean = getThreadMXBean();            if(mbean.isThreadContentionMonitoringSupported()) return;             log.debug("checkJvmThreadContentionMonitoring",                      "Unsupported operation, can't set state");            throw new                SnmpStatusException(SnmpDefinitions.snmpRspInconsistentValue);        }         log.debug("checkJvmThreadContentionMonitoring",                  "Try to set to unknown value");        throw new SnmpStatusException(SnmpDefinitions.snmpRspWrongValue);    }     /**     * Getter for the "JvmThreadTotalStartedCount" variable.     */    public Long getJvmThreadTotalStartedCount() throws SnmpStatusException {        return new Long(getThreadMXBean().getTotalStartedThreadCount());    }     /**     * Getter for the "JvmThreadPeakCount" variable.     */    public Long getJvmThreadPeakCount() throws SnmpStatusException {        return  new Long(getThreadMXBean().getPeakThreadCount());    }     /**     * Getter for the "JvmThreadDaemonCount" variable.     */    public Long getJvmThreadDaemonCount() throws SnmpStatusException {        return new Long(getThreadMXBean().getDaemonThreadCount());    }     /**     * Getter for the "JvmThreadCount" variable.     */    public Long getJvmThreadCount() throws SnmpStatusException {        return new Long(getThreadMXBean().getThreadCount());    }    /**     * Getter for the "JvmThreadPeakCountReset" variable.     */    public synchronized Long getJvmThreadPeakCountReset()        throws SnmpStatusException {        return new Long(jvmThreadPeakCountReset);    }     /**     * Setter for the "JvmThreadPeakCountReset" variable.     */    public synchronized void setJvmThreadPeakCountReset(Long x)        throws SnmpStatusException {        final long l = x.longValue();        if (l > jvmThreadPeakCountReset) {            final long stamp = System.currentTimeMillis();            getThreadMXBean().resetPeakThreadCount();            jvmThreadPeakCountReset = stamp;            log.debug("setJvmThreadPeakCountReset",                      "jvmThreadPeakCountReset="+stamp);        }    }     /**     * Checker for the "JvmThreadPeakCountReset" variable.     */    public void checkJvmThreadPeakCountReset(Long x)        throws SnmpStatusException {    }     /* Last time thread peak count was reset */    private long jvmThreadPeakCountReset=0;     static final MibLogger log = new MibLogger(JvmThreadingImpl.class);}