Author: rmannibucau
Date: Fri Jan 11 16:11:03 2013
New Revision: 1432125

URL: http://svn.apache.org/viewvc?rev=1432125&view=rev
Log:
TOMEE-726 eagerInit of managedconnection pool

Modified:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1432125&r1=1432124&r2=1432125&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 Fri Jan 11 16:11:03 2013
@@ -141,6 +141,8 @@ import javax.naming.InitialContext;
 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 @@ public class Assembler extends Assembler
                 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) {

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java?rev=1432125&r1=1432124&r2=1432125&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
 Fri Jan 11 16:11:03 2013
@@ -382,27 +382,39 @@ public class GeronimoConnectionManagerFa
             final ConnectionInterceptor stack = interceptors.getStack();
 
             ReadWriteLock foundLock = null;
-            if (stack instanceof AbstractSinglePoolConnectionInterceptor) {
+            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 {
-                    foundLock = (ReadWriteLock) 
AbstractSinglePoolConnectionInterceptor.class.getField("resizeLock").get(stack);
-                } catch (IllegalAccessException e) {
-                    // no-op
-                } catch (NoSuchFieldException e) {
-                    // no-op
+                    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;
             }


Reply via email to