From 8cf6e474d233bc43d1e65b6ea61565a4f27e9d1d Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Tue, 21 Sep 2010 09:31:29 +0200 Subject: [PATCH] INT-1452: fix names and counts attributes Add global counts to mbean exporter --- .../AbstractMessageHandlerFactoryBean.java | 2 +- .../monitor/IntegrationMBeanExporter.java | 49 +++++++++++++------ .../LifecycleMessageHandlerMonitor.java | 4 ++ .../monitor/MessageHandlerMonitor.java | 3 ++ .../monitor/SimpleMessageHandlerMonitor.java | 10 ++++ .../HandlerMonitoringIntegrationTests.java | 4 +- 6 files changed, 54 insertions(+), 18 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/AbstractMessageHandlerFactoryBean.java b/spring-integration-core/src/main/java/org/springframework/integration/config/AbstractMessageHandlerFactoryBean.java index 6e753eb129..beeabf137c 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/AbstractMessageHandlerFactoryBean.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/AbstractMessageHandlerFactoryBean.java @@ -125,7 +125,7 @@ abstract class AbstractMessageHandlerFactoryBean implements FactoryBean) { this.handler = this.createMessageProcessingHandler((MessageProcessor) this.targetObject); } else { diff --git a/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/IntegrationMBeanExporter.java b/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/IntegrationMBeanExporter.java index ef5644f7aa..d64d367fc6 100644 --- a/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/IntegrationMBeanExporter.java +++ b/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/IntegrationMBeanExporter.java @@ -13,7 +13,6 @@ package org.springframework.integration.monitor; import java.lang.reflect.Field; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -89,10 +88,6 @@ public class IntegrationMBeanExporter extends MBeanExporter implements BeanPostP public static final String DEFAULT_DOMAIN = "spring.application"; - private Set channelKeys = new HashSet(); - - private Set handlerKeys = new HashSet(); - private final AnnotationJmxAttributeSource attributeSource = new AnnotationJmxAttributeSource(); private ListableBeanFactory beanFactory; @@ -165,11 +160,13 @@ public class IntegrationMBeanExporter extends MBeanExporter implements BeanPostP public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof MessageHandler) { SimpleMessageHandlerMonitor monitor = null; - if (bean instanceof MessageProducer){ // we need to maintain semantics of the handler also being a producer see INT-1431 + if (bean instanceof MessageProducer) { // we need to maintain semantics of the handler also being a producer + // see INT-1431 monitor = new SimpleMessageProducingHandlerMonitor((MessageHandler) bean); - } else { + } + else { monitor = new SimpleMessageHandlerMonitor((MessageHandler) bean); - } + } handlers.add(monitor); return monitor; } @@ -285,23 +282,43 @@ public class IntegrationMBeanExporter extends MBeanExporter implements BeanPostP } @ManagedMetric(metricType = MetricType.COUNTER, displayName = "MessageChannel Channel Count") - public double getChannelCount() { - return channelKeys.size(); + public int getChannelCount() { + return channelsByName.size(); } @ManagedMetric(metricType = MetricType.COUNTER, displayName = "MessageHandler Handler Count") - public double getHandlerCount() { - return handlerKeys.size(); + public int getHandlerCount() { + return handlersByName.size(); } @ManagedAttribute - public Collection getHandlerNames() { - return handlersByName.keySet(); + public String[] getHandlerNames() { + return handlersByName.keySet().toArray(new String[0]); + } + + @ManagedMetric(metricType = MetricType.GAUGE, displayName = "Active Handler Count") + public int getActiveHandlerCount() { + int count = 0; + for (MessageHandlerMonitor monitor : handlers) { + count += monitor.getActiveCount(); + } + return count; + } + + @ManagedMetric(metricType = MetricType.GAUGE, displayName = "Queued Message Count") + public int getQueuedMessageCount() { + int count = 0; + for (MessageChannelMonitor monitor : channels) { + if (monitor instanceof QueueChannelMonitor) { + count += ((QueueChannelMonitor) monitor).getQueueSize(); + } + } + return count; } @ManagedAttribute - public Collection getChannelNames() { - return channelsByName.keySet(); + public String[] getChannelNames() { + return channelsByName.keySet().toArray(new String[0]); } @ManagedOperation(description = "Get the JMX object name (as a String) for the specified Spring bean name") diff --git a/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/LifecycleMessageHandlerMonitor.java b/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/LifecycleMessageHandlerMonitor.java index c630add493..cce1885892 100644 --- a/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/LifecycleMessageHandlerMonitor.java +++ b/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/LifecycleMessageHandlerMonitor.java @@ -92,4 +92,8 @@ public class LifecycleMessageHandlerMonitor implements MessageHandlerMonitor, Li return delegate.getSource(); } + public int getActiveCount() { + return delegate.getActiveCount(); + } + } diff --git a/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/MessageHandlerMonitor.java b/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/MessageHandlerMonitor.java index 4e06cfc904..8bdfd013d9 100644 --- a/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/MessageHandlerMonitor.java +++ b/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/MessageHandlerMonitor.java @@ -58,6 +58,9 @@ public interface MessageHandlerMonitor { @ManagedMetric(metricType = MetricType.GAUGE, displayName = "Handler Standard Deviation Duration") double getStandardDeviationDuration(); + @ManagedMetric(metricType = MetricType.GAUGE, displayName = "Handler Active Status") + int getActiveCount(); + /** * @return summary statistics about the handler duration (milliseconds) */ diff --git a/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/SimpleMessageHandlerMonitor.java b/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/SimpleMessageHandlerMonitor.java index ab6fa1c9a8..67d99257df 100644 --- a/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/SimpleMessageHandlerMonitor.java +++ b/spring-integration-jmx/src/main/java/org/springframework/integration/monitor/SimpleMessageHandlerMonitor.java @@ -44,6 +44,8 @@ public class SimpleMessageHandlerMonitor implements MessageHandler, MessageHandl private final MessageHandler handler; + private final AtomicInteger activeCount = new AtomicInteger(); + private final AtomicInteger handleCount = new AtomicInteger(); private final AtomicInteger errorCount = new AtomicInteger(); @@ -94,6 +96,7 @@ public class SimpleMessageHandlerMonitor implements MessageHandler, MessageHandl try { timer.start(); handleCount.incrementAndGet(); + activeCount.incrementAndGet(); handler.handleMessage(message); @@ -105,6 +108,8 @@ public class SimpleMessageHandlerMonitor implements MessageHandler, MessageHandl } catch (Error e) { errorCount.incrementAndGet(); throw e; + } finally { + activeCount.decrementAndGet(); } } @@ -141,6 +146,11 @@ public class SimpleMessageHandlerMonitor implements MessageHandler, MessageHandl return duration.getStandardDeviation(); } + @ManagedMetric(metricType = MetricType.GAUGE, displayName = "Handler Active Count") + public int getActiveCount() { + return activeCount.get(); + } + public Statistics getDuration() { return duration.getStatistics(); } diff --git a/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/HandlerMonitoringIntegrationTests.java b/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/HandlerMonitoringIntegrationTests.java index 25c968185c..8c4e52517f 100644 --- a/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/HandlerMonitoringIntegrationTests.java +++ b/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/HandlerMonitoringIntegrationTests.java @@ -15,6 +15,8 @@ package org.springframework.integration.monitor; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import java.util.Arrays; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.aspectj.lang.annotation.Aspect; @@ -64,7 +66,7 @@ public class HandlerMonitoringIntegrationTests { ClassPathXmlApplicationContext context = createContext("anonymous-handler.xml", "anonymous"); try { - assertTrue(messageHandlersMonitor.getHandlerNames().contains("errorLogger")); + assertTrue(Arrays.asList(messageHandlersMonitor.getHandlerNames()).contains("errorLogger")); } finally { context.close();