You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2013/11/18 16:10:55 UTC

svn commit: r1543055 - /tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java

Author: rmannibucau
Date: Mon Nov 18 15:10:54 2013
New Revision: 1543055

URL: http://svn.apache.org/r1543055
Log:
TOMEE-1079 sorting resources before destroying them

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

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1543055&r1=1543054&r2=1543055&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Mon Nov 18 15:10:54 2013
@@ -188,6 +188,7 @@ import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -1374,20 +1375,41 @@ public class Assembler extends Assembler
         }
     }
 
-    private void destroyResourceTree(final NamingEnumeration<Binding> namingEnumeration) {
+    private Collection<DestroyingResource> destroyResourceTree(final NamingEnumeration<Binding> namingEnumeration) {
+        final List<DestroyingResource> resources = new LinkedList<DestroyingResource>();
         while (namingEnumeration != null && namingEnumeration.hasMoreElements()) {
             final Binding binding = namingEnumeration.nextElement();
             final Object object = binding.getObject();
             if (Context.class.isInstance(object)) {
                 try {
-                    destroyResourceTree(Context.class.cast(object).listBindings(""));
+                    resources.addAll(destroyResourceTree(Context.class.cast(object).listBindings("")));
                 } catch (final Exception ignored) {
                     // no-op
                 }
             } else {
-                destroyResource(binding.getName(), binding.getClassName(), object);
+                resources.add(new DestroyingResource(binding.getName(), binding.getClassName(), object));
             }
         }
+
+        Collections.sort(resources, new Comparator<DestroyingResource>() { // end by destroying RA after having closed CF pool (for jms for instanceà
+            @Override
+            public int compare(final DestroyingResource o1, final DestroyingResource o2) {
+                if (ResourceAdapter.class.isInstance(o2.instance) && !ResourceAdapter.class.isInstance(o1.instance)) {
+                    return -1;
+                }
+                return 1;
+            }
+        });
+
+        for (final DestroyingResource resource : resources) {
+            try {
+                destroyResource(resource.name, resource.clazz, resource.instance);
+            } catch (final Throwable th) {
+                logger.debug(th.getMessage(), th);
+            }
+        }
+
+        return resources;
     }
 
     private static void destroyResource(final String name, final String className, final Object object) {
@@ -2696,4 +2718,16 @@ public class Assembler extends Assembler
             return delegate != null ? delegate.hashCode() : 0;
         }
     }
+
+    private static class DestroyingResource {
+        private final String name;
+        private final String clazz;
+        private final Object instance;
+
+        private DestroyingResource(final String name, final String clazz, final Object instance) {
+            this.name = name;
+            this.clazz = clazz;
+            this.instance = instance;
+        }
+    }
 }