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;
+ }
+ }
}