Repository: tomee
Updated Branches:
  refs/heads/develop 9fbaca6bb -> 0ee520090


destroying a resource adapter correctly


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/8817e9d5
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/8817e9d5
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/8817e9d5

Branch: refs/heads/develop
Commit: 8817e9d5535166e65ac4efb07e6a9a377bfb48fe
Parents: 9fbaca6
Author: Romain Manni-Bucau <[email protected]>
Authored: Mon Jan 26 22:36:49 2015 +0100
Committer: Romain Manni-Bucau <[email protected]>
Committed: Mon Jan 26 22:36:49 2015 +0100

----------------------------------------------------------------------
 .../openejb/assembler/classic/Assembler.java    | 85 +++++++++++++++++++-
 1 file changed, 84 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/8817e9d5/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
----------------------------------------------------------------------
diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
index b46ac25..40d33d8 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
@@ -150,6 +150,7 @@ import org.apache.webbeans.spi.api.ResourceReference;
 import org.apache.xbean.finder.ClassLoaders;
 import org.apache.xbean.finder.ResourceFinder;
 import org.apache.xbean.finder.UrlSet;
+import org.apache.xbean.naming.reference.SimpleReference;
 import org.apache.xbean.recipe.ObjectRecipe;
 import org.apache.xbean.recipe.Option;
 import org.apache.xbean.recipe.UnsetPropertiesRecipe;
@@ -192,6 +193,8 @@ import java.io.Externalizable;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InvalidObjectException;
+import java.io.ObjectStreamException;
 import java.io.Serializable;
 import java.lang.instrument.ClassFileTransformer;
 import java.lang.instrument.Instrumentation;
@@ -217,6 +220,7 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.locks.ReentrantLock;
@@ -1624,7 +1628,23 @@ public class Assembler extends AssemblerTool implements 
org.apache.openejb.spi.A
     }
 
     private void destroyResource(final String name, final String className, 
final Object object) {
-        if (object instanceof ResourceAdapter) {
+        if (object instanceof ResourceAdapterReference) {
+            final ResourceAdapterReference resourceAdapter = 
(ResourceAdapterReference) object;
+            try {
+                logger.info("Stopping ResourceAdapter: " + name);
+
+                if (logger.isDebugEnabled()) {
+                    logger.debug("Stopping ResourceAdapter: " + className);
+                }
+
+                if (resourceAdapter.pool != null && 
ExecutorService.class.isInstance(resourceAdapter.pool)) {
+                    
ExecutorService.class.cast(resourceAdapter.pool).shutdownNow();
+                }
+                resourceAdapter.ra.stop();
+            } catch (final Throwable t) {
+                logger.fatal("ResourceAdapter Shutdown Failed: " + name, t);
+            }
+        } else if (object instanceof ResourceAdapter) {
             final ResourceAdapter resourceAdapter = (ResourceAdapter) object;
             try {
                 logger.info("Stopping ResourceAdapter: " + name);
@@ -2002,6 +2022,30 @@ public class Assembler extends AssemblerTool implements 
org.apache.openejb.spi.A
                 } catch (final NamingException e) {
                     logger.warning("can't unbind resource '{0}'", connector);
                 }
+
+                for (final ResourceInfo outbound : connector.outbound) {
+                    try {
+                        destroyLookedUpResource(globalContext, outbound.id, 
OPENEJB_RESOURCE_JNDI_PREFIX + outbound.id);
+                    } catch (final Exception e) {
+                        // no-op
+                    }
+                }
+                for (final ResourceInfo outbound : connector.adminObject) {
+                    try {
+                        destroyLookedUpResource(globalContext, outbound.id, 
OPENEJB_RESOURCE_JNDI_PREFIX + outbound.id);
+                    } catch (final Exception e) {
+                        // no-op
+                    }
+                }
+                for (final MdbContainerInfo container : connector.inbound) {
+                    try {
+                        containerSystem.removeContainer(container.id);
+                        config.containerSystem.containers.remove(container);
+                        
this.containerSystem.getJNDIContext().unbind(JAVA_OPENEJB_NAMING_CONTEXT + 
container.service + "/" + container.id);
+                    } catch (final Exception e) {
+                        // no-op
+                    }
+                }
             }
 
             containerSystem.removeAppContext(appInfo.appId);
@@ -2459,6 +2503,8 @@ public class Assembler extends AssemblerTool implements 
org.apache.openejb.spi.A
             final Map<String, Object> unset = 
serviceRecipe.getUnsetProperties();
             unset.remove("threadPoolSize");
             logUnusedProperties(unset, serviceInfo);
+
+            service = new ResourceAdapterReference(resourceAdapter, 
threadPool, OPENEJB_RESOURCE_JNDI_PREFIX + serviceInfo.id);
         } else if (service instanceof ManagedConnectionFactory) {
             final ManagedConnectionFactory managedConnectionFactory = 
(ManagedConnectionFactory) service;
 
@@ -2992,4 +3038,41 @@ public class Assembler extends AssemblerTool implements 
org.apache.openejb.spi.A
             this.instance = instance;
         }
     }
+
+    public static final class ResourceAdapterReference extends SimpleReference 
{
+        private transient ResourceAdapter ra;
+        private transient Executor pool;
+        private final String jndi;
+
+        public ResourceAdapterReference(final ResourceAdapter ra, final 
Executor pool, final String jndi) {
+            this.ra = ra;
+            this.pool = pool;
+            this.jndi = jndi;
+        }
+
+        public Executor getPool() {
+            return pool;
+        }
+
+        public ResourceAdapter getRa() {
+            return ra;
+        }
+
+        public String getJndi() {
+            return jndi;
+        }
+
+        @Override
+        public Object getContent() throws NamingException {
+            return ra;
+        }
+
+        protected Object readResolve() throws ObjectStreamException {
+            try {
+                return 
SystemInstance.get().getComponent(ContainerSystem.class).getJNDIContext().lookup(jndi);
+            } catch (final NamingException e) {
+                throw new InvalidObjectException("name not found: " + jndi);
+            }
+        }
+    }
 }

Reply via email to