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 2014/12/13 13:32:10 UTC
tomee git commit: binding cxf bus lifecycle to the container one
Repository: tomee
Updated Branches:
refs/heads/tomee-1.7.x ebbbc2987 -> c038d362d
binding cxf bus lifecycle to the container one
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/c038d362
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/c038d362
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/c038d362
Branch: refs/heads/tomee-1.7.x
Commit: c038d362d19e6568e2737f24d50efcf7a29a76a7
Parents: ebbbc29
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Sat Dec 13 13:31:49 2014 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Sat Dec 13 13:31:49 2014 +0100
----------------------------------------------------------------------
.../server/cxf/transport/util/CxfUtil.java | 34 ++++++++++++++++++--
1 file changed, 32 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/c038d362/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java
----------------------------------------------------------------------
diff --git a/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java b/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java
index 8747fe2..19f593a 100644
--- a/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java
+++ b/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java
@@ -36,10 +36,12 @@ import org.apache.cxf.message.Message;
import org.apache.openejb.OpenEJBRuntimeException;
import org.apache.openejb.assembler.classic.OpenEjbConfiguration;
import org.apache.openejb.assembler.classic.ServiceInfo;
+import org.apache.openejb.assembler.classic.event.AssemblerDestroyed;
import org.apache.openejb.assembler.classic.util.ServiceConfiguration;
import org.apache.openejb.assembler.classic.util.ServiceInfos;
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.monitoring.LocalMBeanServer;
+import org.apache.openejb.observer.Observes;
import org.apache.openejb.server.cxf.transport.event.BusCreated;
import org.apache.openejb.util.PropertiesHelper;
@@ -52,6 +54,7 @@ import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Level;
public final class CxfUtil {
@@ -67,7 +70,7 @@ public final class CxfUtil {
public static final String BUS_PREFIX = "org.apache.openejb.cxf.bus.";
public static final String BUS_CONFIGURED_FLAG = "openejb.cxf.bus.configured";
private static final Map<String, BindingFactory> bindingFactoryMap = new ConcurrentHashMap<String, BindingFactory>(8, 0.75f, 4);
- private static final Bus DEFAULT_BUS = initDefaultBus(); // has to be initializd after bindingFactoryMap
+ private static final AtomicReference<Bus> DEFAULT_BUS = new AtomicReference<Bus>();
private static volatile boolean usingBindingFactoryMap = false;
private CxfUtil() {
@@ -99,6 +102,8 @@ public final class CxfUtil {
// ensure client proxies can use app classes
CXFBusFactory.setDefaultBus(Bus.class.cast(Proxy.newProxyInstance(CxfUtil.class.getClassLoader(), new Class<?>[]{Bus.class}, new ClientAwareBusHandler())));
+ SystemInstance.get().addObserver(new LifecycleManager());
+
return bus; // we keep as internal the real bus and just expose to cxf the client aware bus to be able to cast it easily
} finally {
Thread.currentThread().setContextClassLoader(cl);
@@ -106,7 +111,18 @@ public final class CxfUtil {
}
public static Bus getBus() {
- return DEFAULT_BUS;
+ Bus bus = DEFAULT_BUS.get();
+ if (bus == null) {
+ synchronized (DEFAULT_BUS) { // synch could be better "in case off
+ // " but with our lifecycle it is far enough since it is thread safe
+ bus = DEFAULT_BUS.get();
+ if (bus == null) {
+ bus = initDefaultBus();
+ DEFAULT_BUS.set(bus);
+ }
+ }
+ }
+ return bus;
}
@Deprecated // no more useful since we create it once
@@ -315,4 +331,18 @@ public final class CxfUtil {
return method.invoke(bus, args);
}
}
+
+ public static class LifecycleManager {
+ public void destroy(@Observes final AssemblerDestroyed ignored) {
+ final SystemInstance systemInstance = SystemInstance.get();
+ final Bus bus = getBus();
+ if ("true".equalsIgnoreCase(systemInstance.getProperty("openejb.cxf.jmx", "true"))) {
+ final InstrumentationManager mgr = bus.getExtension(InstrumentationManager.class);
+ if (InstrumentationManagerImpl.class.isInstance(mgr)) {
+ mgr.shutdown();
+ }
+ }
+ systemInstance.removeObserver(this);
+ }
+ }
}