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 <[email protected]> Authored: Sat Dec 13 13:31:49 2014 +0100 Committer: Romain Manni-Bucau <[email protected]> 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); + } + } }
