Author: markt Date: Wed Aug 17 14:28:40 2011 New Revision: 1158736 URL: http://svn.apache.org/viewvc?rev=1158736&view=rev Log: Expose GOP and GKOP attributes over JMX.
Added: commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPoolMBean.java (with props) commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPoolMBean.java (with props) Modified: commons/proper/pool/trunk/src/changes/changes.xml commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/BaseObjectPoolConfig.java commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java Modified: commons/proper/pool/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/changes/changes.xml?rev=1158736&r1=1158735&r2=1158736&view=diff ============================================================================== --- commons/proper/pool/trunk/src/changes/changes.xml (original) +++ commons/proper/pool/trunk/src/changes/changes.xml Wed Aug 17 14:28:40 2011 @@ -74,6 +74,9 @@ <action dev="markt" type="fix" issue="POOL-178"> Re-factor common code into common base classes. </action> + <action dev="markt" type="update" issue="POOL-172"> + Expose GOP and GKOP attributes via JMX. + </action> </release> <release version="1.5.6" date="2011-04-03" description="This is a patch release, including bugfixes only."> <action dev="markt" type="fix" issue="POOL-179" due-to="Axel Grossmann"> Modified: commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/BaseObjectPoolConfig.java URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/BaseObjectPoolConfig.java?rev=1158736&r1=1158735&r2=1158736&view=diff ============================================================================== --- commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/BaseObjectPoolConfig.java (original) +++ commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/BaseObjectPoolConfig.java Wed Aug 17 14:28:40 2011 @@ -75,7 +75,15 @@ public abstract class BaseObjectPoolConf * The default "block when exhausted" value for the pool. */ public static final boolean DEFAULT_BLOCK_WHEN_EXHAUSTED = true; - + + public static final boolean DEFAULT_JMX_ENABLE = true; + + /** + * The default prefix to use for the name component of the JMX object name + * under which the pool will be registered. + */ + public static final String DEFAULT_JMX_NAME_PREFIX = "pool"; + private boolean lifo = DEFAULT_LIFO; private long maxWait = DEFAULT_MAX_WAIT; @@ -97,6 +105,10 @@ public abstract class BaseObjectPoolConf private boolean blockWhenExhausted = DEFAULT_BLOCK_WHEN_EXHAUSTED; + private boolean jmxEnabled = DEFAULT_JMX_ENABLE; + + private String jmxNamePrefix = DEFAULT_JMX_NAME_PREFIX; + public boolean getLifo() { return lifo; } @@ -168,4 +180,20 @@ public abstract class BaseObjectPoolConf public void setBlockWhenExhausted(boolean blockWhenExhausted) { this.blockWhenExhausted = blockWhenExhausted; } + + public boolean isJmxEnabled() { + return jmxEnabled; + } + + public void setJmxEnabled(boolean jmxEnabled) { + this.jmxEnabled = jmxEnabled; + } + + public String getJmxNamePrefix() { + return jmxNamePrefix; + } + + public void setJmxNamePrefix(String jmxNamePrefix) { + this.jmxNamePrefix = jmxNamePrefix; + } } Modified: commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java?rev=1158736&r1=1158735&r2=1158736&view=diff ============================================================================== --- commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java (original) +++ commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java Wed Aug 17 14:28:40 2011 @@ -17,7 +17,9 @@ package org.apache.commons.pool2.impl; +import java.lang.management.ManagementFactory; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -33,6 +35,13 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import javax.management.InstanceAlreadyExistsException; +import javax.management.MBeanRegistrationException; +import javax.management.MBeanServer; +import javax.management.MalformedObjectNameException; +import javax.management.NotCompliantMBeanException; +import javax.management.ObjectName; + import org.apache.commons.pool2.BaseKeyedObjectPool; import org.apache.commons.pool2.KeyedPoolableObjectFactory; import org.apache.commons.pool2.PoolUtils; @@ -200,7 +209,8 @@ import org.apache.commons.pool2.PoolUtil * @version $Revision$ $Date$ * @since Pool 1.0 */ -public class GenericKeyedObjectPool<K,T> extends BaseKeyedObjectPool<K,T> { +public class GenericKeyedObjectPool<K,T> extends BaseKeyedObjectPool<K,T> + implements GenericKeyedObjectPoolMBean<K> { //--- constructors ----------------------------------------------- @@ -242,6 +252,42 @@ public class GenericKeyedObjectPool<K,T> this.blockWhenExhausted = config.getBlockWhenExhausted(); startEvictor(getMinEvictableIdleTimeMillis()); + + // JMX Registration + if (config.isJmxEnabled()) { + MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); + String jmxNamePrefix = config.getJmxNamePrefix(); + int i = 1; + boolean registered = false; + while (!registered) { + try { + ObjectName oname = + new ObjectName(ONAME_BASE + jmxNamePrefix + i); + mbs.registerMBean(this, oname); + registered = true; + } catch (MalformedObjectNameException e) { + if (GenericObjectPoolConfig.DEFAULT_JMX_NAME_PREFIX.equals( + jmxNamePrefix)) { + // Shouldn't happen. Skip registration if it does. + registered = true; + } else { + // Must be an invalid name prefix. Use the default + // instead. + jmxNamePrefix = + GenericObjectPoolConfig.DEFAULT_JMX_NAME_PREFIX; + } + } catch (InstanceAlreadyExistsException e) { + // Increment the index and try again + i++; + } catch (MBeanRegistrationException e) { + // Shouldn't happen. Skip registration if it does. + registered = true; + } catch (NotCompliantMBeanException e) { + // Shouldn't happen. Skip registration if it does. + registered = true; + } + } + } } //--- configuration methods -------------------------------------- @@ -1508,6 +1554,27 @@ public class GenericKeyedObjectPool<K,T> return objectDefecit; } + + //--- JMX specific attributes ---------------------------------------------- + public Map<String,Integer> getNumActivePerKey() { + HashMap<String,Integer> result = new HashMap<String,Integer>(); + + Iterator<Entry<K,ObjectDeque<T>>> iter = poolMap.entrySet().iterator(); + while (iter.hasNext()) { + Entry<K,ObjectDeque<T>> entry = iter.next(); + if (entry != null) { + K key = entry.getKey(); + ObjectDeque<T> objectDequeue = entry.getValue(); + if (key != null && objectDequeue != null) { + result.put(key.toString(), Integer.valueOf( + objectDequeue.getAllObjects().size() - + objectDequeue.getIdleObjects().size())); + } + } + } + return result; + } + //--- inner classes ---------------------------------------------- /** @@ -1758,4 +1825,7 @@ public class GenericKeyedObjectPool<K,T> * currently being evicted. */ private K evictionKey = null; + + private static final String ONAME_BASE = + "org.apache.commoms.pool2:type=GenericKeyedObjectPool,name="; } Added: commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPoolMBean.java URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPoolMBean.java?rev=1158736&view=auto ============================================================================== --- commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPoolMBean.java (added) +++ commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPoolMBean.java Wed Aug 17 14:28:40 2011 @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.pool2.impl; + +import java.util.Map; + +public interface GenericKeyedObjectPoolMBean<K> { + // Expose standard attributes via JMX + boolean getBlockWhenExhausted(); + boolean getLifo(); + int getMaxIdlePerKey(); + int getMaxTotal(); + int getMaxTotalPerKey(); + long getMaxWait(); + long getMinEvictableIdleTimeMillis(); + int getMinIdlePerKey(); + int getNumActive(); + int getNumIdle(); + int getNumTestsPerEvictionRun(); + boolean getTestOnBorrow(); + boolean getTestOnReturn(); + boolean getTestWhileIdle(); + long getTimeBetweenEvictionRunsMillis(); + boolean isClosed(); + // JMX specific attributes + Map<String,Integer> getNumActivePerKey(); +} Propchange: commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPoolMBean.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java?rev=1158736&r1=1158735&r2=1158736&view=diff ============================================================================== --- commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java (original) +++ commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java Wed Aug 17 14:28:40 2011 @@ -17,6 +17,7 @@ package org.apache.commons.pool2.impl; +import java.lang.management.ManagementFactory; import java.util.Iterator; import java.util.Map; import java.util.NoSuchElementException; @@ -25,6 +26,13 @@ import java.util.concurrent.ConcurrentHa import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; +import javax.management.InstanceAlreadyExistsException; +import javax.management.MBeanRegistrationException; +import javax.management.MBeanServer; +import javax.management.MalformedObjectNameException; +import javax.management.NotCompliantMBeanException; +import javax.management.ObjectName; + import org.apache.commons.pool2.BaseObjectPool; import org.apache.commons.pool2.ObjectPool; import org.apache.commons.pool2.PoolUtils; @@ -164,7 +172,8 @@ import org.apache.commons.pool2.Poolable * 2011) $ * @since Pool 1.0 */ -public class GenericObjectPool<T> extends BaseObjectPool<T> { +public class GenericObjectPool<T> extends BaseObjectPool<T> + implements GenericObjectPoolMBean { // --- constructors ----------------------------------------------- @@ -196,6 +205,42 @@ public class GenericObjectPool<T> extend this.blockWhenExhausted = config.getBlockWhenExhausted(); startEvictor(timeBetweenEvictionRunsMillis); + + // JMX Registration + if (config.isJmxEnabled()) { + MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); + String jmxNamePrefix = config.getJmxNamePrefix(); + int i = 1; + boolean registered = false; + while (!registered) { + try { + ObjectName oname = + new ObjectName(ONAME_BASE + jmxNamePrefix + i); + mbs.registerMBean(this, oname); + registered = true; + } catch (MalformedObjectNameException e) { + if (GenericObjectPoolConfig.DEFAULT_JMX_NAME_PREFIX.equals( + jmxNamePrefix)) { + // Shouldn't happen. Skip registration if it does. + registered = true; + } else { + // Must be an invalid name prefix. Use the default + // instead. + jmxNamePrefix = + GenericObjectPoolConfig.DEFAULT_JMX_NAME_PREFIX; + } + } catch (InstanceAlreadyExistsException e) { + // Increment the index and try again + i++; + } catch (MBeanRegistrationException e) { + // Shouldn't happen. Skip registration if it does. + registered = true; + } catch (NotCompliantMBeanException e) { + // Shouldn't happen. Skip registration if it does. + registered = true; + } + } + } } @@ -1384,4 +1429,7 @@ public class GenericObjectPool<T> extend /** An iterator for {@link #idleObjects} that is used by the evictor. */ private Iterator<PooledObject<T>> evictionIterator = null; + + private static final String ONAME_BASE = + "org.apache.commoms.pool2:type=GenericObjectPool,name="; } Added: commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPoolMBean.java URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPoolMBean.java?rev=1158736&view=auto ============================================================================== --- commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPoolMBean.java (added) +++ commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPoolMBean.java Wed Aug 17 14:28:40 2011 @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.pool2.impl; + +public interface GenericObjectPoolMBean { + // Expose standard attributes via JMX + boolean getBlockWhenExhausted(); + boolean getLifo(); + int getMaxIdle(); + int getMaxTotal(); + long getMaxWait(); + long getMinEvictableIdleTimeMillis(); + int getMinIdle(); + int getNumActive(); + int getNumIdle(); + int getNumTestsPerEvictionRun(); + boolean getTestOnBorrow(); + boolean getTestOnReturn(); + boolean getTestWhileIdle(); + long getTimeBetweenEvictionRunsMillis(); + boolean isClosed(); +} Propchange: commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPoolMBean.java ------------------------------------------------------------------------------ svn:eol-style = native