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