[jboss-cvs] JBossAS SVN: r112506 - in projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool: idle and 2 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Tue Dec 6 11:36:29 EST 2011
Author: jesper.pedersen
Date: 2011-12-06 11:36:29 -0500 (Tue, 06 Dec 2011)
New Revision: 112506
Added:
projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/SecurityActions.java
Modified:
projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java
projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/IdleRemover.java
projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/SecurityActions.java
projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/ArrayBlockingQueueManagedConnectionPool.java
projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/SemaphoreArrayListManagedConnectionPool.java
projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/ConnectionValidator.java
Log:
[JBJCA-712] Incorrect shutdown order
Modified: projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java 2011-12-06 16:34:43 UTC (rev 112505)
+++ projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java 2011-12-06 16:36:29 UTC (rev 112506)
@@ -583,7 +583,14 @@
{
log.debug(poolName + ": shutdown");
- flush(true);
+ Iterator<ManagedConnectionPool> it = mcpPools.values().iterator();
+ while (it.hasNext())
+ {
+ ManagedConnectionPool mcp = it.next();
+ mcp.shutdown();
+ }
+
+ mcpPools.clear();
}
/**
Modified: projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/IdleRemover.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/IdleRemover.java 2011-12-06 16:34:43 UTC (rev 112505)
+++ projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/IdleRemover.java 2011-12-06 16:36:29 UTC (rev 112506)
@@ -29,6 +29,7 @@
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
@@ -47,7 +48,7 @@
private static CoreLogger logger = Logger.getMessageLogger(CoreLogger.class, IdleRemover.class.getName());
/**Validator thread name*/
- private static final String VALIDATOR_THREAD_NAME = "JBossConnectionValidator";
+ private static final String THREAD_NAME = "IdleRemover";
/**Singleton instance*/
private static final IdleRemover INSTANCE = new IdleRemover();
@@ -65,6 +66,9 @@
/** The next - important initialization! */
private long next = Long.MAX_VALUE;
+ /** Shutdown */
+ private AtomicBoolean shutdown = new AtomicBoolean(false);
+
/**Lock for condition*/
private Lock lock = new ReentrantLock(true);
@@ -76,8 +80,8 @@
*/
private IdleRemover()
{
- this.executorService = Executors.newSingleThreadExecutor(new ValidatorThreadFactory());
- this.executorService.execute(new JBossConnectionValidator());
+ this.executorService = Executors.newSingleThreadExecutor(new IdleRemoverThreadFactory());
+ this.executorService.execute(new IdleConnectionsRemover());
}
/**
@@ -87,6 +91,8 @@
*/
public static void registerPool(IdleConnectionRemovalSupport mcp, long interval)
{
+ logger.debugf("Register pool: %s (interval=%s)", mcp, interval);
+
INSTANCE.internalRegisterPool(mcp, interval);
}
@@ -96,8 +102,23 @@
*/
public static void unregisterPool(IdleConnectionRemovalSupport mcp)
{
+ logger.debugf("Unregister pool: %s", mcp);
+
INSTANCE.internalUnregisterPool(mcp);
}
+
+ /**
+ * Shutdown
+ */
+ public static void shutdown()
+ {
+ INSTANCE.shutdown.set(true);
+
+ INSTANCE.executorService.shutdownNow();
+ INSTANCE.executorService = null;
+
+ INSTANCE.registeredPools.clear();
+ }
private void internalRegisterPool(IdleConnectionRemovalSupport mcp, long interval)
{
@@ -121,7 +142,6 @@
}
this.condition.signal();
-
}
}
}
@@ -147,32 +167,16 @@
}
/**
- * Wait for background thread.
- */
- public static void waitForBackgroundThread()
- {
- try
- {
- INSTANCE.lock.lock();
-
- }
- finally
- {
- INSTANCE.lock.unlock();
- }
- }
-
- /**
* Thread factory.
*/
- private static class ValidatorThreadFactory implements ThreadFactory
+ private static class IdleRemoverThreadFactory implements ThreadFactory
{
/**
* {@inheritDoc}
*/
public Thread newThread(Runnable r)
{
- Thread thread = new Thread(r, IdleRemover.VALIDATOR_THREAD_NAME);
+ Thread thread = new Thread(r, IdleRemover.THREAD_NAME);
thread.setDaemon(true);
return thread;
@@ -180,15 +184,14 @@
}
/**
- * JBossConnectionValidator.
- *
+ * IdleConnectionsRemover
*/
- private class JBossConnectionValidator implements Runnable
+ private class IdleConnectionsRemover implements Runnable
{
/**
* Constructor
*/
- public JBossConnectionValidator()
+ public IdleConnectionsRemover()
{
}
@@ -197,13 +200,14 @@
*/
public void run()
{
+ final ClassLoader oldTccl = SecurityActions.getThreadContextClassLoader();
SecurityActions.setThreadContextClassLoader(IdleRemover.class.getClassLoader());
try
{
lock.lock();
- while (true)
+ while (!shutdown.get())
{
boolean result = INSTANCE.condition.await(INSTANCE.interval, TimeUnit.MILLISECONDS);
@@ -227,14 +231,12 @@
if (next < 0)
{
next = Long.MAX_VALUE;
- }
+ }
}
}
catch (InterruptedException e)
{
logger.returningConnectionValidatorInterrupted();
-
- return;
}
catch (RuntimeException e)
{
@@ -247,7 +249,8 @@
finally
{
lock.unlock();
- }
- }
+ SecurityActions.setThreadContextClassLoader(oldTccl);
+ }
+ }
}
}
Modified: projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/SecurityActions.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/SecurityActions.java 2011-12-06 16:34:43 UTC (rev 112505)
+++ projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/SecurityActions.java 2011-12-06 16:36:29 UTC (rev 112506)
@@ -33,6 +33,28 @@
class SecurityActions
{
/**
+ * Get the context classloader.
+ * @return The classloader
+ */
+ public static ClassLoader getThreadContextClassLoader()
+ {
+ if (System.getSecurityManager() == null)
+ {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ else
+ {
+ return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+ {
+ public ClassLoader run()
+ {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ });
+ }
+ }
+
+ /**
* Set the context classloader.
* @param cl classloader
*/
Modified: projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/ArrayBlockingQueueManagedConnectionPool.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/ArrayBlockingQueueManagedConnectionPool.java 2011-12-06 16:34:43 UTC (rev 112505)
+++ projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/ArrayBlockingQueueManagedConnectionPool.java 2011-12-06 16:36:29 UTC (rev 112506)
@@ -601,7 +601,7 @@
shutdown.set(true);
IdleRemover.unregisterPool(this);
ConnectionValidator.unregisterPool(this);
- flush();
+ flush(true);
}
/**
Modified: projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/SemaphoreArrayListManagedConnectionPool.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/SemaphoreArrayListManagedConnectionPool.java 2011-12-06 16:34:43 UTC (rev 112505)
+++ projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/SemaphoreArrayListManagedConnectionPool.java 2011-12-06 16:36:29 UTC (rev 112506)
@@ -641,7 +641,7 @@
shutdown.set(true);
IdleRemover.unregisterPool(this);
ConnectionValidator.unregisterPool(this);
- flush();
+ flush(true);
}
/**
Modified: projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/ConnectionValidator.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/ConnectionValidator.java 2011-12-06 16:34:43 UTC (rev 112505)
+++ projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/ConnectionValidator.java 2011-12-06 16:36:29 UTC (rev 112506)
@@ -25,13 +25,12 @@
import org.jboss.jca.core.CoreLogger;
import org.jboss.jca.core.connectionmanager.pool.mcp.ManagedConnectionPool;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
@@ -50,7 +49,7 @@
private static CoreLogger logger = Logger.getMessageLogger(CoreLogger.class, ConnectionValidator.class.getName());
/**Validator thread name*/
- private static final String VALIDATOR_THREAD_NAME = "JBossConnectionValidator";
+ private static final String THREAD_NAME = "ConnectionValidator";
/**Registered internal pool instances*/
private CopyOnWriteArrayList<ManagedConnectionPool> registeredPools =
@@ -65,17 +64,18 @@
/** The interval */
private long interval = Long.MAX_VALUE;
- /** The next */
- //important initialization!
+ /** The next - important initialization */
private long next = Long.MAX_VALUE;
+ /** Shutdown */
+ private AtomicBoolean shutdown = new AtomicBoolean(false);
+
/**Lock for condition*/
private Lock lock = new ReentrantLock(true);
/**Condition*/
private Condition condition = lock.newCondition();
-
/**
* Private constructor.
*/
@@ -92,6 +92,8 @@
*/
public static void registerPool(ManagedConnectionPool mcp, long interval)
{
+ logger.debugf("Register pool: %s (interval=%s)", mcp, interval);
+
instance.internalRegisterPool(mcp, interval);
}
@@ -101,9 +103,24 @@
*/
public static void unregisterPool(ManagedConnectionPool mcp)
{
+ logger.debugf("Unregister pool: %s", mcp);
+
instance.internalUnregisterPool(mcp);
}
+ /**
+ * Shutdown
+ */
+ public static void shutdown()
+ {
+ instance.shutdown.set(true);
+
+ instance.executorService.shutdownNow();
+ instance.executorService = null;
+
+ instance.registeredPools.clear();
+ }
+
private void internalRegisterPool(ManagedConnectionPool mcp, long interval)
{
try
@@ -151,71 +168,8 @@
interval = Long.MAX_VALUE;
}
}
-
+
/**
- * Setup context class loader.
- */
- private void setupContextClassLoader()
- {
- // Could be null if loaded from system classloader
- final ClassLoader cl = ConnectionValidator.class.getClassLoader();
- if (cl == null)
- {
- return;
- }
-
- SecurityManager sm = System.getSecurityManager();
-
- if (sm == null)
- {
- Thread.currentThread().setContextClassLoader(cl);
-
- return;
- }
-
- AccessController.doPrivileged(new ClassLoaderAction(cl));
-
- }
-
- /**
- * Priviledge action.
- */
- private static class ClassLoaderAction implements PrivilegedAction<Object>
- {
- private ClassLoader classLoader;
-
- public ClassLoaderAction(ClassLoader cl)
- {
- this.classLoader = cl;
- }
-
- public Object run()
- {
- Thread.currentThread().setContextClassLoader(classLoader);
-
- return null;
- }
-
- }
-
- /**
- * Wait for background thread.
- */
- public static void waitForBackgroundThread()
- {
- try
- {
- instance.lock.lock();
-
- }
- finally
- {
- instance.lock.unlock();
- }
- }
-
-
- /**
* Thread factory.
*/
private static class ValidatorThreadFactory implements ThreadFactory
@@ -225,7 +179,7 @@
*/
public Thread newThread(Runnable r)
{
- Thread thread = new Thread(r, ConnectionValidator.VALIDATOR_THREAD_NAME);
+ Thread thread = new Thread(r, ConnectionValidator.THREAD_NAME);
thread.setDaemon(true);
return thread;
@@ -238,19 +192,19 @@
*/
private class JBossConnectionValidator implements Runnable
{
-
/**
* {@inheritDoc}
*/
public void run()
{
- setupContextClassLoader();
+ final ClassLoader oldTccl = SecurityActions.getThreadContextClassLoader();
+ SecurityActions.setThreadContextClassLoader(ConnectionValidator.class.getClassLoader());
try
{
lock.lock();
- while (true)
+ while (!shutdown.get())
{
boolean result = instance.condition.await(instance.interval, TimeUnit.MILLISECONDS);
@@ -280,8 +234,6 @@
catch (InterruptedException e)
{
logger.returningConnectionValidatorInterrupted();
-
- return;
}
catch (RuntimeException e)
{
@@ -294,7 +246,8 @@
finally
{
lock.unlock();
- }
- }
+ SecurityActions.setThreadContextClassLoader(oldTccl);
+ }
+ }
}
}
Added: projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/SecurityActions.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/SecurityActions.java (rev 0)
+++ projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/SecurityActions.java 2011-12-06 16:36:29 UTC (rev 112506)
@@ -0,0 +1,83 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.jca.core.connectionmanager.pool.validator;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+/**
+ * Privileged Blocks
+ *
+ * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
+ */
+class SecurityActions
+{
+ /**
+ * Get the context classloader.
+ * @return The classloader
+ */
+ public static ClassLoader getThreadContextClassLoader()
+ {
+ if (System.getSecurityManager() == null)
+ {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ else
+ {
+ return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+ {
+ public ClassLoader run()
+ {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ });
+ }
+ }
+
+ /**
+ * Set the context classloader.
+ * @param cl classloader
+ */
+ public static void setThreadContextClassLoader(final ClassLoader cl)
+ {
+ if (cl == null)
+ return;
+
+ if (System.getSecurityManager() == null)
+ {
+ Thread.currentThread().setContextClassLoader(cl);
+ }
+ else
+ {
+ AccessController.doPrivileged(new PrivilegedAction<Object>()
+ {
+ public Object run()
+ {
+ Thread.currentThread().setContextClassLoader(cl);
+
+ return null;
+ }
+ });
+ }
+ }
+}
More information about the jboss-cvs-commits
mailing list