TOMEE-726 eagerInit of managedconnection pool
git-svn-id: https://svn.apache.org/repos/asf/openejb/trunk@1432125 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java b/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
index eb76e04..52c45ae 100644
--- a/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
+++ b/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
@@ -141,6 +141,8 @@
import javax.naming.NameAlreadyBoundException;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
+import javax.resource.cci.Connection;
+import javax.resource.cci.ConnectionFactory;
import javax.resource.spi.BootstrapContext;
import javax.resource.spi.ConnectionManager;
import javax.resource.spi.ManagedConnectionFactory;
@@ -1885,18 +1887,32 @@
if (unsetB.containsKey(entry.getKey()))
unset.put(entry.getKey(), entry.getValue());
}
- logUnusedProperties(unset, serviceInfo);
- if (connectionManager instanceof AbstractConnectionManager) {
+ // service becomes a ConnectorReference which merges connection manager and mcf
+ service = new ConnectorReference(connectionManager, managedConnectionFactory);
+
+ // init cm if needed
+ final Object eagerInit = unset.remove("eagerInit");
+ if (eagerInit != null && eagerInit instanceof String && "true".equalsIgnoreCase((String) eagerInit)
+ && connectionManager instanceof AbstractConnectionManager) {
try {
((AbstractConnectionManager) connectionManager).doStart();
+ try {
+ final Object cf = managedConnectionFactory.createConnectionFactory(connectionManager);
+ if (cf instanceof ConnectionFactory) {
+ final Connection connection = ((ConnectionFactory) cf).getConnection();
+ connection.getMetaData();
+ connection.close();
+ }
+ } catch (Exception e) {
+ // no-op: just to force eager init of pool
+ }
} catch (Exception e) {
logger.warning("Can't start connection manager", e);
}
}
- // service becomes a ConnectorReference which merges connection manager and mcf
- service = new ConnectorReference(connectionManager, managedConnectionFactory);
+ logUnusedProperties(unset, serviceInfo);
} else if (service instanceof DataSource) {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
if (classLoader == null) {
diff --git a/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java b/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
index 5ca1e74..eabcece 100644
--- a/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
+++ b/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
@@ -382,27 +382,39 @@
final ConnectionInterceptor stack = interceptors.getStack();
ReadWriteLock foundLock = null;
- if (stack instanceof AbstractSinglePoolConnectionInterceptor) {
- try {
- foundLock = (ReadWriteLock) AbstractSinglePoolConnectionInterceptor.class.getField("resizeLock").get(stack);
- } catch (IllegalAccessException e) {
- // no-op
- } catch (NoSuchFieldException e) {
- // no-op
+ ConnectionInterceptor current = stack;
+ do {
+ if (current instanceof AbstractSinglePoolConnectionInterceptor) {
+ try {
+ foundLock = (ReadWriteLock) AbstractSinglePoolConnectionInterceptor.class.getField("resizeLock").get(current);
+ } catch (IllegalAccessException e) {
+ // no-op
+ } catch (NoSuchFieldException e) {
+ // no-op
+ }
+ break;
}
- }
+
+ // look next
+ try {
+ current = (ConnectionInterceptor) Reflections.get(current, "next");
+ } catch (Exception e) {
+ current = null;
+ }
+ } while (current != null);
+
this.lock = foundLock;
Object foundPool = null;
- if (stack instanceof AbstractSinglePoolConnectionInterceptor) {
+ if (current instanceof AbstractSinglePoolConnectionInterceptor) {
foundPool = Reflections.get(stack, "pool");
- } else if (stack instanceof MultiPoolConnectionInterceptor) {
+ } else if (current instanceof MultiPoolConnectionInterceptor) {
log.warn("validation on stack " + stack + " not supported");
}
this.pool = foundPool;
if (pool != null) {
- validatingTask = new ValidatingTask(stack, lock, pool);
+ validatingTask = new ValidatingTask(current, lock, pool);
} else {
validatingTask = null;
}