Author: psteitz
Date: Sun Dec 9 16:55:07 2007
New Revision: 602765
URL: http://svn.apache.org/viewvc?rev=602765&view=rev
Log:
Added a wrapper for the shared idle object eviction timer for all pools.
The wrapper class wraps the Timer and keeps track of how many pools are
using it. If no pools are using the timer, it is canceled. This prevents
a thread being left running which, in application server environments,
can lead to memory leads and/or prevent applications from shutting down
or reloading cleanly.
JIRA: POOL-97
Patched by Mark Thomas
Added:
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/EvictionTimer.java
(with props)
Modified:
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericObjectPool.java
commons/proper/pool/trunk/xdocs/changes.xml
Added:
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/EvictionTimer.java
URL:
http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/EvictionTimer.java?rev=602765&view=auto
==============================================================================
---
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/EvictionTimer.java
(added)
+++
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/EvictionTimer.java
Sun Dec 9 16:55:07 2007
@@ -0,0 +1,76 @@
+/*
+ * 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.pool.impl;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * <p>
+ * Provides a shared idle object eviction timer for all pools. This class wraps
+ * the standard [EMAIL PROTECTED] Timer} and keeps track of how many pools are
using it.
+ * If no pools are using the timer, it is canceled. This prevents a thread
+ * being left running which, in application server environments, can lead to
+ * memory leads and/or prevent applications from shutting down or reloading
+ * cleanly.
+ * </p>
+ * <p>
+ * This class has package scope to prevent its inclusion in the pool public
API.
+ * The class declaration below should *not* be changed to public.
+ * </p>
+ */
+class EvictionTimer {
+ private static Timer _timer;
+ private static int _usageCount;
+
+ private EvictionTimer() {
+ // Hide the default constuctor
+ }
+
+ /**
+ * Add the specified eviction task to the timer. Tasks that are added with
a
+ * call to this method *must* call [EMAIL PROTECTED] #cancel(TimerTask)}
to cancel the
+ * task to prevent memory and/or thread leaks in application server
+ * environments.
+ * @param task Task to be scheduled
+ * @param delay Delay in milliseconds before task is executed
+ * @param period Time in milliseconds between executions
+ */
+ static synchronized void schedule(TimerTask task, long delay, long period)
{
+ if (null == _timer) {
+ _timer = new Timer();
+ }
+ _usageCount++;
+ _timer.schedule(task, delay, period);
+ }
+
+ /**
+ * Remove the specified eviction task from the timer.
+ * @param task Task to be scheduled
+ * @param delay Delay in milliseconds before task is executed
+ * @param period Time in milliseconds between executions
+ */
+ static synchronized void cancel(TimerTask task) {
+ task.cancel();
+ _usageCount--;
+ if (_usageCount == 0) {
+ _timer.cancel();
+ _timer = null;
+ }
+ }
+}
Propchange:
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/EvictionTimer.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified:
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java
URL:
http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java?rev=602765&r1=602764&r2=602765&view=diff
==============================================================================
---
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java
(original)
+++
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java
Sun Dec 9 16:55:07 2007
@@ -1244,10 +1244,7 @@
_evictionKeyCursor.close();
_evictionKeyCursor = null;
}
- if (null != _evictor) {
- _evictor.cancel();
- _evictor = null;
- }
+ startEvictor(-1L);
}
}
@@ -1491,12 +1488,12 @@
*/
protected synchronized void startEvictor(long delay) {
if(null != _evictor) {
- _evictor.cancel();
+ EvictionTimer.cancel(_evictor);
_evictor = null;
}
if(delay > 0) {
_evictor = new Evictor();
- GenericObjectPool.EVICTION_TIMER.schedule(_evictor, delay, delay);
+ EvictionTimer.schedule(_evictor, delay, delay);
}
}
@@ -1849,11 +1846,6 @@
*/
private Evictor _evictor = null;
- /**
- * Position in the _pool where the _evictor last stopped.
- */
- private int _evictLastIndex = -1;
-
/**
* A cursorable list of my pools.
* @see GenericKeyedObjectPool.Evictor#run
Modified:
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericObjectPool.java
URL:
http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericObjectPool.java?rev=602765&r1=602764&r2=602765&view=diff
==============================================================================
---
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericObjectPool.java
(original)
+++
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericObjectPool.java
Sun Dec 9 16:55:07 2007
@@ -19,9 +19,6 @@
import java.util.Iterator;
import java.util.NoSuchElementException;
-import java.util.LinkedList;
-import java.util.ListIterator;
-import java.util.Timer;
import java.util.TimerTask;
import org.apache.commons.pool.BaseObjectPool;
@@ -281,13 +278,6 @@
*/
public static final long DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS = -1;
- //--- package constants -------------------------------------------
-
- /**
- * Idle object evition Timer. Shared between all [EMAIL PROTECTED]
GenericObjectPool}s and [EMAIL PROTECTED] GenericKeyedObjectPool} s.
- */
- static final Timer EVICTION_TIMER = new Timer(true);
-
//--- constructors -----------------------------------------------
/**
@@ -1094,7 +1084,6 @@
public synchronized void evict() throws Exception {
assertOpen();
if(!_pool.isEmpty()) {
- ListIterator iter;
if (null == _evictionCursor) {
_evictionCursor = (_pool.cursor(_lifo ? _pool.size() : 0));
}
@@ -1200,12 +1189,12 @@
*/
protected synchronized void startEvictor(long delay) {
if(null != _evictor) {
- _evictor.cancel();
+ EvictionTimer.cancel(_evictor);
_evictor = null;
}
if(delay > 0) {
_evictor = new Evictor();
- EVICTION_TIMER.schedule(_evictor, delay, delay);
+ EvictionTimer.schedule(_evictor, delay, delay);
}
}
Modified: commons/proper/pool/trunk/xdocs/changes.xml
URL:
http://svn.apache.org/viewvc/commons/proper/pool/trunk/xdocs/changes.xml?rev=602765&r1=602764&r2=602765&view=diff
==============================================================================
--- commons/proper/pool/trunk/xdocs/changes.xml (original)
+++ commons/proper/pool/trunk/xdocs/changes.xml Sun Dec 9 16:55:07 2007
@@ -88,6 +88,14 @@
GenericObjectPool.DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS (was
being incorrectly defaulted to DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS).
</action>
+ <action dev="psteitz" type="fix" issue="POOL-97" due-to="Mark Thomas">
+ Added a wrapper for the shared idle object eviction timer for all
+ pools. The wrapper class wraps the Timer and keeps track of how many
+ pools are using it. If no pools are using the timer, it is canceled.
+ This prevents a thread being left running which, in application server
+ environments, can lead to memory leads and/or prevent applications
+ from shutting down or reloading cleanly.
+ </action>
</release>
<release version="1.3" date="2006-pending" description="1.x bugfix
release">