User: ejort Date: 02/01/26 13:06:29 Modified: src/main/javax/management/monitor GaugeMonitor.java Log: Fixed reset of notifications Revision Changes Path 1.2 +364 -367 jmx/src/main/javax/management/monitor/GaugeMonitor.java Index: GaugeMonitor.java =================================================================== RCS file: /cvsroot/jboss/jmx/src/main/javax/management/monitor/GaugeMonitor.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- GaugeMonitor.java 2001/12/21 01:39:37 1.1 +++ GaugeMonitor.java 2002/01/26 21:06:29 1.2 @@ -1,367 +1,364 @@ -/* -* JBoss, the OpenSource EJB server -* -* Distributable under LGPL license. -* See terms of license at gnu.org. -*/ -package javax.management.monitor; - -import javax.management.MBeanAttributeInfo; -import javax.management.MBeanNotificationInfo; - -// REVIEW: Check synchronization - -/** - * The gauge monitor service. - * - * @author <a href="mailto:[EMAIL PROTECTED]">Adrian Brock</a> - * @version $Revision: 1.1 $ - * - */ -public class GaugeMonitor - extends Monitor - implements GaugeMonitorMBean -{ - // Constants ----------------------------------------------------- - - /** - * The gauge high threshold exceeded has been notified. - */ - int THRESHOLD_HIGH_EXCEEDED_NOTIFIED = 16; - - /** - * The gauge low threshold exceeded has been notified. - */ - int THRESHOLD_LOW_EXCEEDED_NOTIFIED = 32; - - /** - * The threshold type error has been notified. - */ - int THRESHOLD_ERROR_NOTIFIED = 64; - - // Attributes ---------------------------------------------------- - - /** - * The derived gauge. - */ - private Number derivedGauge = new Integer(0); - - /** - * The last value. - */ - private Number lastValue = null; - - /** - * The derived gauge timeStamp. - */ - private long derivedGaugeTimeStamp = 0; - - /** - * Difference mode. - */ - boolean differenceMode = false; - - /** - * The high threshold. - */ - Number highThreshold = new Integer(0); - - /** - * The low threshold. - */ - Number lowThreshold = new Integer(0); - - /** - * High Notify. - */ - boolean notifyHigh = false; - - /** - * Low Notify. - */ - boolean notifyLow = false; - - // Static -------------------------------------------------------- - - // Constructors -------------------------------------------------- - - /** - * Default Constructor - */ - public GaugeMonitor() - { - dbgTag = "GaugeMonitor"; - } - - // Public -------------------------------------------------------- - - public MBeanNotificationInfo[] getNotificationInfo() - { - MBeanNotificationInfo[] result = new MBeanNotificationInfo[1]; - String[] types = new String[] - { - MonitorNotification.RUNTIME_ERROR, - MonitorNotification.OBSERVED_OBJECT_ERROR, - MonitorNotification.OBSERVED_ATTRIBUTE_ERROR, - MonitorNotification.OBSERVED_ATTRIBUTE_TYPE_ERROR, - MonitorNotification.THRESHOLD_ERROR, - MonitorNotification.THRESHOLD_HIGH_VALUE_EXCEEDED, - MonitorNotification.THRESHOLD_LOW_VALUE_EXCEEDED - }; - result[0] = new MBeanNotificationInfo(types, - "javax.management.monitor.MonitorNotification", - "Notifications sent by the Gauge Monitor Service MBean"); - return result; - } - - // GaugeMonitorMBean implementation ------------------------------ - - public Number getDerivedGauge() - { - return derivedGauge; - } - - public long getDerivedGaugeTimeStamp() - { - return derivedGaugeTimeStamp; - } - - public boolean getDifferenceMode() - { - return differenceMode; - } - - public void setDifferenceMode(boolean value) - { - differenceMode = value; - } - - public boolean getNotifyHigh() - { - return notifyHigh; - } - - public void setNotifyHigh(boolean value) - { - notifyHigh = value; - } - - public boolean getNotifyLow() - { - return notifyLow; - } - - public void setNotifyLow(boolean value) - { - notifyLow = value; - } - - public Number getHighThreshold() - { - return highThreshold; - } - - public Number getLowThreshold() - { - return lowThreshold; - } - - public void setThresholds(Number highValue, Number lowValue) - throws IllegalArgumentException - { - if (highValue == null) - throw new IllegalArgumentException("Null high threshold"); - if (lowValue == null) - throw new IllegalArgumentException("Null low threshold"); - if (highValue.getClass() != lowValue.getClass()) - throw new IllegalArgumentException("High and low different types"); - if (highValue.doubleValue() < lowValue.doubleValue()) - throw new IllegalArgumentException("High less than low threshold"); - highThreshold = highValue; - lowThreshold = lowValue; - alreadyNotified = RESET_FLAGS_ALREADY_NOTIFIED; - } - - // Override start to reset the last value for difference mode and - // to get the initial gauge. - public synchronized void start() - { - lastValue = null; - derivedGauge = new Integer(0); - derivedGaugeTimeStamp = System.currentTimeMillis(); - super.start(); - } - - // Package protected --------------------------------------------- - - // REVIEW: This works but needs tidying up! - void monitor(MBeanAttributeInfo attributeInfo, Object value) - throws Exception - { - // Wrong type of attribute - if (!(value instanceof Number)) - { - sendAttributeTypeErrorNotification("Attribute is not a number"); - return; - } - - // Wrong threshold types - if (highThreshold.getClass() != value.getClass() - || lowThreshold.getClass() != value.getClass()) - { - sendThresholdErrorNotification(value); - return; - } - - // Cast the gauge to a Number - Number number = (Number) value; - - // Get the gauge and record when we got it. - if (differenceMode) - { - if (lastValue == null) - derivedGauge = getZero(number); - else - derivedGauge = sub(number, lastValue); - } - else - derivedGauge = number; - derivedGaugeTimeStamp = System.currentTimeMillis(); - - // Fire the event if the low threshold has been exceeded - if (derivedGauge.doubleValue() <= lowThreshold.doubleValue()) - { - if ((alreadyNotified & THRESHOLD_LOW_EXCEEDED_NOTIFIED) == 0) - { - sendThresholdLowExceededNotification(derivedGauge); - alreadyNotified |= THRESHOLD_LOW_EXCEEDED_NOTIFIED; - } - } - else - { - // Reset notfication when it becomes higher than low threshold - if (derivedGauge.doubleValue() > lowThreshold.doubleValue()) - alreadyNotified &= ~THRESHOLD_LOW_EXCEEDED_NOTIFIED; - } - - // Fire the event if the high threshold has been exceeded - if (derivedGauge.doubleValue() >= highThreshold.doubleValue()) - { - if ((alreadyNotified & THRESHOLD_HIGH_EXCEEDED_NOTIFIED) == 0) - { - sendThresholdHighExceededNotification(derivedGauge); - alreadyNotified |= THRESHOLD_HIGH_EXCEEDED_NOTIFIED; - } - } - else - { - // Reset notfication when it becomes less than high threshold - if (derivedGauge.doubleValue() < highThreshold.doubleValue()) - alreadyNotified &= ~THRESHOLD_HIGH_EXCEEDED_NOTIFIED; - } - - // Remember the last value - lastValue = number; - } - - /** - * Get zero for the type passed. - * - * @param the reference object - * @return zero for the correct type - */ - Number getZero(Number value) - { - if (value instanceof Byte) - return new Byte((byte) 0); - if (value instanceof Integer) - return new Integer(0); - if (value instanceof Long) - return new Long(0); - if (value instanceof Short) - return new Short((short) 0); - if (value instanceof Float) - return new Float((float) 0); - return new Double((double) 0); - } - - /** - * Subtract two numbers. - * @param value1 the first value. - * @param value2 the second value. - * @return value1 - value2 of the correct type - */ - Number sub(Number value1, Number value2) - { - if (value1 instanceof Byte) - return new Byte((byte) (value1.byteValue() - value2.byteValue())); - if (value1 instanceof Integer) - return new Integer(value1.intValue() - value2.intValue()); - if (value1 instanceof Long) - return new Long((value1.longValue() - value2.longValue())); - if (value1 instanceof Short) - return new Short((short) (value1.shortValue() - value2.shortValue())); - if (value1 instanceof Float) - return new Float((value1.floatValue() - value2.floatValue())); - return new Double(value1.doubleValue() - value2.doubleValue()); - } - - /** - * Send a threshold low exceeded event.<p> - * - * This is only performed when requested and it has not already been sent. - * - * @param value the attribute value. - */ - void sendThresholdLowExceededNotification(Object value) - { - if (notifyLow) - { - sendNotification(MonitorNotification.THRESHOLD_LOW_VALUE_EXCEEDED, - derivedGaugeTimeStamp, "low threshold exceeded", observedAttribute, - value, lowThreshold); - } - } - - /** - * Send a high threshold exceeded event.<p> - * - * This is only performed when requested and it has not already been sent. - * - * @param value the attribute value. - */ - void sendThresholdHighExceededNotification(Object value) - { - if (notifyHigh) - { - sendNotification(MonitorNotification.THRESHOLD_HIGH_VALUE_EXCEEDED, - derivedGaugeTimeStamp, "high threshold exceeded", observedAttribute, - value, highThreshold); - } - } - - /** - * Send a threshold error event.<p> - * - * This is only performed when requested and it has not already been sent. - * - * @param value the attribute value. - */ - void sendThresholdErrorNotification(Object value) - { - if ((alreadyNotified & THRESHOLD_ERROR_NOTIFIED) == 0) - { - sendNotification(MonitorNotification.THRESHOLD_ERROR, - derivedGaugeTimeStamp, - "High or Low Threshold not the correct type", - observedAttribute, null, null); - alreadyNotified |= THRESHOLD_ERROR_NOTIFIED; - } - } - - // Protected ----------------------------------------------------- - - // Private ------------------------------------------------------- - - // Inner classes ------------------------------------------------- -} +/* +* JBoss, the OpenSource EJB server +* +* Distributable under LGPL license. +* See terms of license at gnu.org. +*/ +package javax.management.monitor; + +import javax.management.MBeanAttributeInfo; +import javax.management.MBeanNotificationInfo; + +// REVIEW: Check synchronization + +/** + * The gauge monitor service. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Adrian Brock</a> + * @version $Revision: 1.2 $ + * + */ +public class GaugeMonitor + extends Monitor + implements GaugeMonitorMBean +{ + // Constants ----------------------------------------------------- + + /** + * The gauge high threshold exceeded has been notified. + */ + int THRESHOLD_HIGH_EXCEEDED_NOTIFIED = 16; + + /** + * The gauge low threshold exceeded has been notified. + */ + int THRESHOLD_LOW_EXCEEDED_NOTIFIED = 32; + + /** + * The threshold type error has been notified. + */ + int THRESHOLD_ERROR_NOTIFIED = 64; + + // Attributes ---------------------------------------------------- + + /** + * The derived gauge. + */ + private Number derivedGauge = new Integer(0); + + /** + * The last value. + */ + private Number lastValue = null; + + /** + * The derived gauge timeStamp. + */ + private long derivedGaugeTimeStamp = 0; + + /** + * Difference mode. + */ + boolean differenceMode = false; + + /** + * The high threshold. + */ + Number highThreshold = new Integer(0); + + /** + * The low threshold. + */ + Number lowThreshold = new Integer(0); + + /** + * High Notify. + */ + boolean notifyHigh = false; + + /** + * Low Notify. + */ + boolean notifyLow = false; + + // Static -------------------------------------------------------- + + // Constructors -------------------------------------------------- + + /** + * Default Constructor + */ + public GaugeMonitor() + { + dbgTag = "GaugeMonitor"; + } + + // Public -------------------------------------------------------- + + public MBeanNotificationInfo[] getNotificationInfo() + { + MBeanNotificationInfo[] result = new MBeanNotificationInfo[1]; + String[] types = new String[] + { + MonitorNotification.RUNTIME_ERROR, + MonitorNotification.OBSERVED_OBJECT_ERROR, + MonitorNotification.OBSERVED_ATTRIBUTE_ERROR, + MonitorNotification.OBSERVED_ATTRIBUTE_TYPE_ERROR, + MonitorNotification.THRESHOLD_ERROR, + MonitorNotification.THRESHOLD_HIGH_VALUE_EXCEEDED, + MonitorNotification.THRESHOLD_LOW_VALUE_EXCEEDED + }; + result[0] = new MBeanNotificationInfo(types, + "javax.management.monitor.MonitorNotification", + "Notifications sent by the Gauge Monitor Service MBean"); + return result; + } + + // GaugeMonitorMBean implementation ------------------------------ + + public Number getDerivedGauge() + { + return derivedGauge; + } + + public long getDerivedGaugeTimeStamp() + { + return derivedGaugeTimeStamp; + } + + public boolean getDifferenceMode() + { + return differenceMode; + } + + public void setDifferenceMode(boolean value) + { + differenceMode = value; + } + + public boolean getNotifyHigh() + { + return notifyHigh; + } + + public void setNotifyHigh(boolean value) + { + notifyHigh = value; + } + + public boolean getNotifyLow() + { + return notifyLow; + } + + public void setNotifyLow(boolean value) + { + notifyLow = value; + } + + public Number getHighThreshold() + { + return highThreshold; + } + + public Number getLowThreshold() + { + return lowThreshold; + } + + public void setThresholds(Number highValue, Number lowValue) + throws IllegalArgumentException + { + if (highValue == null) + throw new IllegalArgumentException("Null high threshold"); + if (lowValue == null) + throw new IllegalArgumentException("Null low threshold"); + if (highValue.getClass() != lowValue.getClass()) + throw new IllegalArgumentException("High and low different types"); + if (highValue.doubleValue() < lowValue.doubleValue()) + throw new IllegalArgumentException("High less than low threshold"); + highThreshold = highValue; + lowThreshold = lowValue; + alreadyNotified = RESET_FLAGS_ALREADY_NOTIFIED; + } + + // Override start to reset the last value for difference mode and + // to get the initial gauge. + public synchronized void start() + { + lastValue = null; + derivedGauge = new Integer(0); + derivedGaugeTimeStamp = System.currentTimeMillis(); + super.start(); + } + + // Package protected --------------------------------------------- + + // REVIEW: This works but needs tidying up! + void monitor(MBeanAttributeInfo attributeInfo, Object value) + throws Exception + { + // Wrong type of attribute + if (!(value instanceof Number)) + { + sendAttributeTypeErrorNotification("Attribute is not a number"); + return; + } + + // Wrong threshold types + if (highThreshold.getClass() != value.getClass() + || lowThreshold.getClass() != value.getClass()) + { + sendThresholdErrorNotification(value); + return; + } + + // Cast the gauge to a Number + Number number = (Number) value; + + // Get the gauge and record when we got it. + if (differenceMode) + { + if (lastValue == null) + derivedGauge = getZero(number); + else + derivedGauge = sub(number, lastValue); + } + else + derivedGauge = number; + derivedGaugeTimeStamp = System.currentTimeMillis(); + + // Fire the event if the low threshold has been exceeded + if (derivedGauge.doubleValue() <= lowThreshold.doubleValue()) + { + if ((alreadyNotified & THRESHOLD_LOW_EXCEEDED_NOTIFIED) == 0) + { + // Reset high threshold + alreadyNotified &= ~THRESHOLD_HIGH_EXCEEDED_NOTIFIED; + + // Send the notification once + sendThresholdLowExceededNotification(derivedGauge); + alreadyNotified |= THRESHOLD_LOW_EXCEEDED_NOTIFIED; + } + } + + // Fire the event if the high threshold has been exceeded + if (derivedGauge.doubleValue() >= highThreshold.doubleValue()) + { + + if ((alreadyNotified & THRESHOLD_HIGH_EXCEEDED_NOTIFIED) == 0) + { + // Reset low threshold + alreadyNotified &= ~THRESHOLD_LOW_EXCEEDED_NOTIFIED; + + // Send the notification once + sendThresholdHighExceededNotification(derivedGauge); + alreadyNotified |= THRESHOLD_HIGH_EXCEEDED_NOTIFIED; + } + } + + // Remember the last value + lastValue = number; + } + + /** + * Get zero for the type passed. + * + * @param the reference object + * @return zero for the correct type + */ + Number getZero(Number value) + { + if (value instanceof Byte) + return new Byte((byte) 0); + if (value instanceof Integer) + return new Integer(0); + if (value instanceof Long) + return new Long(0); + if (value instanceof Short) + return new Short((short) 0); + if (value instanceof Float) + return new Float((float) 0); + return new Double((double) 0); + } + + /** + * Subtract two numbers. + * @param value1 the first value. + * @param value2 the second value. + * @return value1 - value2 of the correct type + */ + Number sub(Number value1, Number value2) + { + if (value1 instanceof Byte) + return new Byte((byte) (value1.byteValue() - value2.byteValue())); + if (value1 instanceof Integer) + return new Integer(value1.intValue() - value2.intValue()); + if (value1 instanceof Long) + return new Long((value1.longValue() - value2.longValue())); + if (value1 instanceof Short) + return new Short((short) (value1.shortValue() - value2.shortValue())); + if (value1 instanceof Float) + return new Float((value1.floatValue() - value2.floatValue())); + return new Double(value1.doubleValue() - value2.doubleValue()); + } + + /** + * Send a threshold low exceeded event.<p> + * + * This is only performed when requested and it has not already been sent. + * + * @param value the attribute value. + */ + void sendThresholdLowExceededNotification(Object value) + { + if (notifyLow) + { + sendNotification(MonitorNotification.THRESHOLD_LOW_VALUE_EXCEEDED, + derivedGaugeTimeStamp, "low threshold exceeded", observedAttribute, + value, lowThreshold); + } + } + + /** + * Send a high threshold exceeded event.<p> + * + * This is only performed when requested and it has not already been sent. + * + * @param value the attribute value. + */ + void sendThresholdHighExceededNotification(Object value) + { + if (notifyHigh) + { + sendNotification(MonitorNotification.THRESHOLD_HIGH_VALUE_EXCEEDED, + derivedGaugeTimeStamp, "high threshold exceeded", observedAttribute, + value, highThreshold); + } + } + + /** + * Send a threshold error event.<p> + * + * This is only performed when requested and it has not already been sent. + * + * @param value the attribute value. + */ + void sendThresholdErrorNotification(Object value) + { + if ((alreadyNotified & THRESHOLD_ERROR_NOTIFIED) == 0) + { + sendNotification(MonitorNotification.THRESHOLD_ERROR, + derivedGaugeTimeStamp, + "High or Low Threshold not the correct type", + observedAttribute, null, null); + alreadyNotified |= THRESHOLD_ERROR_NOTIFIED; + } + } + + // Protected ----------------------------------------------------- + + // Private ------------------------------------------------------- + + // Inner classes ------------------------------------------------- +}
_______________________________________________ Jboss-development mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-development
