[jboss-cvs] JBossAS SVN: r112512 - in projects/jboss-jca/trunk: core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp and 3 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Tue Dec 13 03:28:38 EST 2011
Author: jesper.pedersen
Date: 2011-12-13 03:28:38 -0500 (Tue, 13 Dec 2011)
New Revision: 112512
Modified:
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/IdleRemover.java
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/ArrayBlockingQueueManagedConnectionPool.java
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/SemaphoreArrayListManagedConnectionPool.java
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/ConnectionValidator.java
projects/jboss-jca/trunk/embedded/src/main/resources/jca.xml
projects/jboss-jca/trunk/sjc/src/main/resources/bootstrap/jca.xml
Log:
[JBJCA-712] Restructure background workers
Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/IdleRemover.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/IdleRemover.java 2011-12-09 16:45:51 UTC (rev 112511)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/IdleRemover.java 2011-12-13 08:28:38 UTC (rev 112512)
@@ -1,6 +1,6 @@
/*
* JBoss, Home of Professional Open Source.
- * Copyright 2008-2009, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2008-2011, 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.
*
@@ -37,89 +37,146 @@
import org.jboss.logging.Logger;
/**
- * Connection validator class.
+ * Idle remover
*
* @author <a href="mailto:gurkanerdogdu at yahoo.com">Gurkan Erdogdu</a>
* @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
*/
public class IdleRemover
{
- /**Logger instance*/
+ /** Logger instance */
private static CoreLogger logger = Logger.getMessageLogger(CoreLogger.class, IdleRemover.class.getName());
- /**Validator thread name*/
+ /** Thread name */
private static final String THREAD_NAME = "IdleRemover";
- /**Singleton instance*/
- private static final IdleRemover INSTANCE = new IdleRemover();
+ /** Singleton instance */
+ private static IdleRemover instance = new IdleRemover();
- /**Registered internal pool instances*/
+ /** Registered pool instances */
private CopyOnWriteArrayList<IdleConnectionRemovalSupport> registeredPools =
new CopyOnWriteArrayList<IdleConnectionRemovalSupport>();
- /**Validator executor service*/
- private ExecutorService executorService = null;
+ /** Executor service */
+ private ExecutorService executorService;
+ /** Is the executor external */
+ private boolean isExternal;
+
/** The interval */
- private long interval = Long.MAX_VALUE;
+ private long interval;
- /** The next - important initialization! */
- private long next = Long.MAX_VALUE;
+ /** The next scan */
+ private long next;
/** Shutdown */
- private AtomicBoolean shutdown = new AtomicBoolean(false);
+ private AtomicBoolean shutdown;
- /**Lock for condition*/
- private Lock lock = new ReentrantLock(true);
+ /** Lock */
+ private Lock lock;
- /**Condition*/
- private Condition condition = lock.newCondition();
+ /** Condition */
+ private Condition condition;
/**
* Private constructor.
*/
private IdleRemover()
{
- this.executorService = Executors.newSingleThreadExecutor(new IdleRemoverThreadFactory());
- this.executorService.execute(new IdleConnectionsRemover());
+ this.executorService = null;
+ this.isExternal = false;
+ this.interval = Long.MAX_VALUE;
+ this.next = Long.MAX_VALUE;
+ this.shutdown = new AtomicBoolean(false);
+ this.lock = new ReentrantLock(true);
+ this.condition = lock.newCondition();
}
+
+ /**
+ * Get the instance
+ * @return The value
+ */
+ public static IdleRemover getInstance()
+ {
+ return instance;
+ }
/**
+ * Set the executor service
+ * @param v The value
+ */
+ public void setExecutorService(ExecutorService v)
+ {
+ if (v != null)
+ {
+ this.executorService = v;
+ this.isExternal = true;
+ }
+ else
+ {
+ this.executorService = null;
+ this.isExternal = false;
+ }
+ }
+
+ /**
+ * Start
+ * @exception Throwable Thrown if an error occurs
+ */
+ public void start() throws Throwable
+ {
+ if (!isExternal)
+ {
+ this.executorService = Executors.newSingleThreadExecutor(new IdleRemoverThreadFactory());
+ }
+
+ this.shutdown.set(false);
+ this.interval = Long.MAX_VALUE;
+ this.next = Long.MAX_VALUE;
+
+ this.executorService.execute(new IdleRemoverRunner());
+ }
+
+ /**
+ * Stop
+ * @exception Throwable Thrown if an error occurs
+ */
+ public void stop() throws Throwable
+ {
+ instance.shutdown.set(true);
+
+ if (!isExternal)
+ {
+ instance.executorService.shutdownNow();
+ instance.executorService = null;
+ }
+
+ instance.registeredPools.clear();
+ }
+
+ /**
* Register pool for connection validation.
* @param mcp managed connection pool
* @param interval validation interval
*/
- public static void registerPool(IdleConnectionRemovalSupport mcp, long interval)
+ public void registerPool(IdleConnectionRemovalSupport mcp, long interval)
{
logger.debugf("Register pool: %s (interval=%s)", mcp, interval);
- INSTANCE.internalRegisterPool(mcp, interval);
+ instance.internalRegisterPool(mcp, interval);
}
/**
* Unregister pool instance for connection validation.
* @param mcp pool instance
*/
- public static void unregisterPool(IdleConnectionRemovalSupport mcp)
+ public void unregisterPool(IdleConnectionRemovalSupport mcp)
{
logger.debugf("Unregister pool: %s", mcp);
- INSTANCE.internalUnregisterPool(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)
{
try
@@ -137,8 +194,7 @@
next = maybeNext;
if (logger.isDebugEnabled())
{
- logger.debug("internalRegisterPool: about to notify thread: old next: " +
- next + ", new next: " + maybeNext);
+ logger.debug("About to notify thread: old next: " + next + ", new next: " + maybeNext);
}
this.condition.signal();
@@ -159,7 +215,7 @@
{
if (logger.isDebugEnabled())
{
- logger.debug("internalUnregisterPool: setting interval to Long.MAX_VALUE");
+ logger.debug("Setting interval to Long.MAX_VALUE");
}
interval = Long.MAX_VALUE;
@@ -184,18 +240,11 @@
}
/**
- * IdleConnectionsRemover
+ * IdleRemoverRunner
*/
- private class IdleConnectionsRemover implements Runnable
+ private class IdleRemoverRunner implements Runnable
{
/**
- * Constructor
- */
- public IdleConnectionsRemover()
- {
- }
-
- /**
* {@inheritDoc}
*/
public void run()
@@ -209,16 +258,16 @@
while (!shutdown.get())
{
- boolean result = INSTANCE.condition.await(INSTANCE.interval, TimeUnit.MILLISECONDS);
+ boolean result = instance.condition.await(instance.interval, TimeUnit.MILLISECONDS);
if (logger.isTraceEnabled())
{
- logger.trace("Result of await ConnectionValidator: " + result);
+ logger.trace("Result of await: " + result);
}
if (logger.isDebugEnabled())
{
- logger.debug("run: ConnectionValidator notifying pools, interval: " + interval);
+ logger.debug("Notifying pools, interval: " + interval);
}
for (IdleConnectionRemovalSupport mcp : registeredPools)
@@ -236,7 +285,8 @@
}
catch (InterruptedException e)
{
- logger.returningConnectionValidatorInterrupted();
+ if (!shutdown.get())
+ logger.returningConnectionValidatorInterrupted();
}
catch (RuntimeException e)
{
Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/ArrayBlockingQueueManagedConnectionPool.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/ArrayBlockingQueueManagedConnectionPool.java 2011-12-09 16:45:51 UTC (rev 112511)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/ArrayBlockingQueueManagedConnectionPool.java 2011-12-13 08:28:38 UTC (rev 112512)
@@ -174,7 +174,7 @@
if (poolConfiguration.getIdleTimeoutMinutes() > 0)
{
//Register removal support
- IdleRemover.registerPool(this, poolConfiguration.getIdleTimeoutMinutes() * 1000 * 60);
+ IdleRemover.getInstance().registerPool(this, poolConfiguration.getIdleTimeoutMinutes() * 1000 * 60);
}
if (poolConfiguration.isBackgroundValidation() && poolConfiguration.getBackgroundValidationMillis() > 0)
@@ -183,7 +183,7 @@
poolConfiguration.getBackgroundValidationMillis());
//Register validation
- ConnectionValidator.registerPool(this, poolConfiguration.getBackgroundValidationMillis());
+ ConnectionValidator.getInstance().registerPool(this, poolConfiguration.getBackgroundValidationMillis());
}
shutdown.set(false);
@@ -599,8 +599,8 @@
public void shutdown()
{
shutdown.set(true);
- IdleRemover.unregisterPool(this);
- ConnectionValidator.unregisterPool(this);
+ IdleRemover.getInstance().unregisterPool(this);
+ ConnectionValidator.getInstance().unregisterPool(this);
flush(true);
}
Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/SemaphoreArrayListManagedConnectionPool.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/SemaphoreArrayListManagedConnectionPool.java 2011-12-09 16:45:51 UTC (rev 112511)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/SemaphoreArrayListManagedConnectionPool.java 2011-12-13 08:28:38 UTC (rev 112512)
@@ -207,7 +207,7 @@
if (poolConfiguration.getIdleTimeoutMinutes() > 0)
{
//Register removal support
- IdleRemover.registerPool(this, poolConfiguration.getIdleTimeoutMinutes() * 1000 * 60);
+ IdleRemover.getInstance().registerPool(this, poolConfiguration.getIdleTimeoutMinutes() * 1000 * 60);
}
if (poolConfiguration.isBackgroundValidation() && poolConfiguration.getBackgroundValidationMillis() > 0)
@@ -216,7 +216,7 @@
poolConfiguration.getBackgroundValidationMillis());
//Register validation
- ConnectionValidator.registerPool(this, poolConfiguration.getBackgroundValidationMillis());
+ ConnectionValidator.getInstance().registerPool(this, poolConfiguration.getBackgroundValidationMillis());
}
shutdown.set(false);
@@ -639,8 +639,8 @@
public void shutdown()
{
shutdown.set(true);
- IdleRemover.unregisterPool(this);
- ConnectionValidator.unregisterPool(this);
+ IdleRemover.getInstance().unregisterPool(this);
+ ConnectionValidator.getInstance().unregisterPool(this);
flush(true);
}
Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/ConnectionValidator.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/ConnectionValidator.java 2011-12-09 16:45:51 UTC (rev 112511)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/ConnectionValidator.java 2011-12-13 08:28:38 UTC (rev 112512)
@@ -1,6 +1,6 @@
/*
* JBoss, Home of Professional Open Source.
- * Copyright 2008-2009, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2008-2011, 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.
*
@@ -38,59 +38,129 @@
import org.jboss.logging.Logger;
/**
- * Connection validator class.
+ * Connection validator
*
* @author <a href="mailto:gurkanerdogdu at yahoo.com">Gurkan Erdogdu</a>
- * @version $Rev: $
+ * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
*/
public class ConnectionValidator
{
- /**Logger instance*/
+ /** Logger instance */
private static CoreLogger logger = Logger.getMessageLogger(CoreLogger.class, ConnectionValidator.class.getName());
- /**Validator thread name*/
+ /** Thread name */
private static final String THREAD_NAME = "ConnectionValidator";
- /**Registered internal pool instances*/
+ /** Singleton instance */
+ private static ConnectionValidator instance = new ConnectionValidator();
+
+ /** Registered pool instances */
private CopyOnWriteArrayList<ManagedConnectionPool> registeredPools =
new CopyOnWriteArrayList<ManagedConnectionPool>();
- /**Validator executor service*/
- private ExecutorService executorService = null;
+ /** Executor service */
+ private ExecutorService executorService;
+
+ /** Is the executor external */
+ private boolean isExternal;
- /**Singleton instance*/
- private static ConnectionValidator instance = new ConnectionValidator();
-
/** The interval */
- private long interval = Long.MAX_VALUE;
+ private long interval;
- /** The next - important initialization */
- private long next = Long.MAX_VALUE;
+ /** The next scan */
+ private long next;
/** Shutdown */
- private AtomicBoolean shutdown = new AtomicBoolean(false);
+ private AtomicBoolean shutdown;
- /**Lock for condition*/
- private Lock lock = new ReentrantLock(true);
+ /** Lock */
+ private Lock lock;
- /**Condition*/
- private Condition condition = lock.newCondition();
+ /** Condition */
+ private Condition condition;
/**
* Private constructor.
*/
private ConnectionValidator()
{
- this.executorService = Executors.newSingleThreadExecutor(new ValidatorThreadFactory());
- this.executorService.execute(new JBossConnectionValidator());
+ this.executorService = null;
+ this.isExternal = false;
+ this.interval = Long.MAX_VALUE;
+ this.next = Long.MAX_VALUE;
+ this.shutdown = new AtomicBoolean(false);
+ this.lock = new ReentrantLock(true);
+ this.condition = lock.newCondition();
}
+
+ /**
+ * Get the instance
+ * @return The value
+ */
+ public static ConnectionValidator getInstance()
+ {
+ return instance;
+ }
/**
+ * Set the executor service
+ * @param v The value
+ */
+ public void setExecutorService(ExecutorService v)
+ {
+ if (v != null)
+ {
+ this.executorService = v;
+ this.isExternal = true;
+ }
+ else
+ {
+ this.executorService = null;
+ this.isExternal = false;
+ }
+ }
+
+ /**
+ * Start
+ * @exception Throwable Thrown if an error occurs
+ */
+ public void start() throws Throwable
+ {
+ if (!isExternal)
+ {
+ this.executorService = Executors.newSingleThreadExecutor(new ValidatorThreadFactory());
+ }
+
+ this.shutdown.set(false);
+ this.interval = Long.MAX_VALUE;
+ this.next = Long.MAX_VALUE;
+
+ this.executorService.execute(new ConnectionValidatorRunner());
+ }
+
+ /**
+ * Stop
+ * @exception Throwable Thrown if an error occurs
+ */
+ public void stop() throws Throwable
+ {
+ instance.shutdown.set(true);
+
+ if (!isExternal)
+ {
+ instance.executorService.shutdownNow();
+ instance.executorService = null;
+ }
+
+ instance.registeredPools.clear();
+ }
+
+ /**
* Register pool for connection validation.
* @param mcp managed connection pool
* @param interval validation interval
*/
- public static void registerPool(ManagedConnectionPool mcp, long interval)
+ public void registerPool(ManagedConnectionPool mcp, long interval)
{
logger.debugf("Register pool: %s (interval=%s)", mcp, interval);
@@ -101,26 +171,13 @@
* Unregister pool instance for connection validation.
* @param mcp pool instance
*/
- public static void unregisterPool(ManagedConnectionPool mcp)
+ public 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
@@ -138,15 +195,12 @@
next = maybeNext;
if (logger.isDebugEnabled())
{
- logger.debug("internalRegisterPool: about to notify thread: old next: " +
- next + ", new next: " + maybeNext);
+ logger.debug("About to notify thread: old next: " + next + ", new next: " + maybeNext);
}
this.condition.signal();
-
}
}
-
}
finally
{
@@ -162,7 +216,7 @@
{
if (logger.isDebugEnabled())
{
- logger.debug("internalUnregisterPool: setting interval to Long.MAX_VALUE");
+ logger.debug("Setting interval to Long.MAX_VALUE");
}
interval = Long.MAX_VALUE;
@@ -187,10 +241,10 @@
}
/**
- * JBossConnectionValidator.
+ * ConnectionValidatorRunner.
*
*/
- private class JBossConnectionValidator implements Runnable
+ private class ConnectionValidatorRunner implements Runnable
{
/**
* {@inheritDoc}
@@ -210,12 +264,12 @@
if (logger.isTraceEnabled())
{
- logger.trace("Result of await ConnectionValidator: " + result);
+ logger.trace("Result of await: " + result);
}
if (logger.isDebugEnabled())
{
- logger.debug("run: ConnectionValidator notifying pools, interval: " + interval);
+ logger.debug("Notifying pools, interval: " + interval);
}
for (ManagedConnectionPool mcp : registeredPools)
@@ -233,7 +287,8 @@
}
catch (InterruptedException e)
{
- logger.returningConnectionValidatorInterrupted();
+ if (!shutdown.get())
+ logger.returningConnectionValidatorInterrupted();
}
catch (RuntimeException e)
{
Modified: projects/jboss-jca/trunk/embedded/src/main/resources/jca.xml
===================================================================
--- projects/jboss-jca/trunk/embedded/src/main/resources/jca.xml 2011-12-09 16:45:51 UTC (rev 112511)
+++ projects/jboss-jca/trunk/embedded/src/main/resources/jca.xml 2011-12-13 08:28:38 UTC (rev 112512)
@@ -93,6 +93,20 @@
interface="org.jboss.jca.core.spi.security.Callback"
class="org.jboss.jca.core.security.UsersRoles"/>
+ <!-- Idle remover -->
+ <bean name="IdleRemover">
+ <constructor factoryClass="org.jboss.jca.core.connectionmanager.pool.idle.IdleRemover"
+ factoryMethod="getInstance">
+ </constructor>
+ </bean>
+
+ <!-- Connection validator -->
+ <bean name="ConnectionValidator">
+ <constructor factoryClass="org.jboss.jca.core.connectionmanager.pool.validator.ConnectionValidator"
+ factoryMethod="getInstance">
+ </constructor>
+ </bean>
+
<!-- Work Manager -->
<bean name="WorkManager"
interface="org.jboss.jca.core.api.workmanager.WorkManager"
@@ -218,6 +232,8 @@
<property name="Kernel"><inject bean="Kernel"/></property>
<depends>BeanValidation</depends>
<depends>JBossStdioContextSelector</depends>
+ <depends>IdleRemover</depends>
+ <depends>ConnectionValidator</depends>
</bean>
<!-- -ra.xml deployer -->
@@ -228,6 +244,8 @@
<property name="Kernel"><inject bean="Kernel"/></property>
<depends>BeanValidation</depends>
<depends>JBossStdioContextSelector</depends>
+ <depends>IdleRemover</depends>
+ <depends>ConnectionValidator</depends>
</bean>
<!-- RA activator -->
@@ -244,6 +262,8 @@
</property>
<depends>BeanValidation</depends>
<depends>JBossStdioContextSelector</depends>
+ <depends>IdleRemover</depends>
+ <depends>ConnectionValidator</depends>
</bean>
</deployment>
Modified: projects/jboss-jca/trunk/sjc/src/main/resources/bootstrap/jca.xml
===================================================================
--- projects/jboss-jca/trunk/sjc/src/main/resources/bootstrap/jca.xml 2011-12-09 16:45:51 UTC (rev 112511)
+++ projects/jboss-jca/trunk/sjc/src/main/resources/bootstrap/jca.xml 2011-12-13 08:28:38 UTC (rev 112512)
@@ -96,6 +96,20 @@
<property name="RolesProperties">${iron.jacamar.home}/config/roles.properties</property>
</bean>
+ <!-- Idle remover -->
+ <bean name="IdleRemover">
+ <constructor factoryClass="org.jboss.jca.core.connectionmanager.pool.idle.IdleRemover"
+ factoryMethod="getInstance">
+ </constructor>
+ </bean>
+
+ <!-- Connection validator -->
+ <bean name="ConnectionValidator">
+ <constructor factoryClass="org.jboss.jca.core.connectionmanager.pool.validator.ConnectionValidator"
+ factoryMethod="getInstance">
+ </constructor>
+ </bean>
+
<!-- Work Manager -->
<bean name="WorkManager"
interface="org.jboss.jca.core.api.workmanager.WorkManager"
@@ -212,6 +226,8 @@
<property name="Kernel"><inject bean="Kernel"/></property>
<depends>BeanValidation</depends>
<depends>JBossStdioContextSelector</depends>
+ <depends>IdleRemover</depends>
+ <depends>ConnectionValidator</depends>
</bean>
<!-- -ra.xml deployer -->
@@ -222,6 +238,8 @@
<property name="Kernel"><inject bean="Kernel"/></property>
<depends>BeanValidation</depends>
<depends>JBossStdioContextSelector</depends>
+ <depends>IdleRemover</depends>
+ <depends>ConnectionValidator</depends>
</bean>
<!-- RA activator -->
@@ -238,6 +256,8 @@
</property>
<depends>BeanValidation</depends>
<depends>JBossStdioContextSelector</depends>
+ <depends>IdleRemover</depends>
+ <depends>ConnectionValidator</depends>
</bean>
</deployment>
More information about the jboss-cvs-commits
mailing list