[jboss-cvs] JBossAS SVN: r109246 - in projects/cluster/ha-server-ispn/trunk/src: test/java/org/jboss/ha/ispn and 1 other directory.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Wed Nov 10 15:16:32 EST 2010
Author: pferraro
Date: 2010-11-10 15:16:31 -0500 (Wed, 10 Nov 2010)
New Revision: 109246
Modified:
projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainerFactory.java
projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainerRegistry.java
projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/DefaultCacheContainerFactoryTest.java
projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/DefaultCacheContainerRegistryTest.java
Log:
Move cache mbean deregistration to DefaultCacheContainerFactory.
Override infinispan global configuration with custom MBeanServerLookup.
Modified: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainerFactory.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainerFactory.java 2010-11-10 19:56:31 UTC (rev 109245)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainerFactory.java 2010-11-10 20:16:31 UTC (rev 109246)
@@ -21,15 +21,31 @@
*/
package org.jboss.ha.ispn;
+import java.lang.ref.WeakReference;
+import java.util.Locale;
import java.util.Properties;
+import javax.management.JMException;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
import org.infinispan.config.Configuration;
import org.infinispan.config.GlobalConfiguration;
import org.infinispan.config.GlobalConfiguration.ShutdownHookBehavior;
+import org.infinispan.jmx.CacheJmxRegistration;
+import org.infinispan.jmx.ComponentsJmxRegistration;
+import org.infinispan.jmx.MBeanServerLookup;
+import org.infinispan.manager.CacheContainer;
import org.infinispan.manager.DefaultCacheManager;
import org.infinispan.manager.EmbeddedCacheManager;
+import org.infinispan.notifications.Listener;
+import org.infinispan.notifications.cachemanagerlistener.annotation.CacheStarted;
+import org.infinispan.notifications.cachemanagerlistener.annotation.CacheStopped;
+import org.infinispan.notifications.cachemanagerlistener.event.CacheStartedEvent;
+import org.infinispan.notifications.cachemanagerlistener.event.CacheStoppedEvent;
import org.infinispan.remoting.transport.jgroups.JGroupsChannelLookup;
import org.infinispan.remoting.transport.jgroups.JGroupsTransport;
+import org.jboss.logging.Logger;
import org.jgroups.Channel;
import org.jgroups.ChannelFactory;
@@ -39,20 +55,25 @@
* @author Paul Ferraro
*/
@SuppressWarnings("deprecation")
+ at Listener
public class DefaultCacheContainerFactory implements CacheContainerFactory
{
public static final String CHANNEL_ID = "channelId";
public static final String CHANNEL_FACTORY = "channelFactory";
+
+ private static Logger logger = Logger.getLogger(DefaultCacheContainerFactory.class);
private final ChannelFactory channelFactory;
+ private final MBeanServer server;
/**
* Creates a new cache container factory using the specified channel factory.
* @param channelFactory a channel factory
*/
- public DefaultCacheContainerFactory(ChannelFactory channelFactory)
+ public DefaultCacheContainerFactory(ChannelFactory channelFactory, MBeanServer server)
{
this.channelFactory = channelFactory;
+ this.server = server;
}
/**
@@ -78,6 +99,9 @@
}
}
+ MBeanServerReferenceLookup.serverRef = new WeakReference<MBeanServer>(this.server);
+ global.setMBeanServerLookup(MBeanServerReferenceLookup.class.getName());
+
EmbeddedCacheManager manager = new DefaultCacheManager(global, configuration.getDefaultConfiguration(), false);
// Add named configurations
@@ -89,6 +113,52 @@
return new DefaultCacheContainer(manager);
}
+ @CacheStarted
+ public void cacheStarted(CacheStartedEvent event)
+ {
+ log("Started", event.getCacheName(), event.getCacheManager());
+ }
+
+ @CacheStopped
+ public void cacheStopped(CacheStoppedEvent event)
+ {
+ String cacheName = event.getCacheName();
+ EmbeddedCacheManager container = event.getCacheManager();
+
+ log("Stopped", cacheName, container);
+
+ // Infinispan does not unregister cache mbean when cache stops (only when cache manager is stopped), so do it now to avoid classloader leaks
+ Configuration configuration = cacheName.equals(CacheContainer.DEFAULT_CACHE_NAME) ? container.getDefaultConfiguration() : container.defineConfiguration(cacheName, new Configuration());
+ if (configuration.isExposeJmxStatistics())
+ {
+ GlobalConfiguration global = container.getGlobalConfiguration();
+ String domain = global.getJmxDomain();
+ String jmxCacheName = String.format("%s(%s)", cacheName, configuration.getCacheModeString().toLowerCase(Locale.ENGLISH));
+ String containerName = global.getCacheManagerName();
+
+ try
+ {
+ // Fragile code alert!
+ ObjectName name = ObjectName.getInstance(String.format("%s:%s,%s=%s,manager=%s,%s=%s", domain, CacheJmxRegistration.CACHE_JMX_GROUP, ComponentsJmxRegistration.NAME_KEY, ObjectName.quote(jmxCacheName), ObjectName.quote(containerName), ComponentsJmxRegistration.COMPONENT_KEY, "Cache"));
+
+ if (this.server.isRegistered(name))
+ {
+ this.server.unregisterMBean(name);
+ logger.debug(String.format("Unregistered cache mbean: %s", name));
+ }
+ }
+ catch (JMException e)
+ {
+ logger.warn(String.format("Failed to unregister mbean for %s cache", cacheName), e);
+ }
+ }
+ }
+
+ private static void log(String event, String cacheName, EmbeddedCacheManager container)
+ {
+ logger.info(String.format("%s \"%s\" cache from \"%s\" container", event, cacheName, container.getGlobalConfiguration().getCacheManagerName()));
+ }
+
/**
* JGroupsChannelLookup implementation that uses a channel factory.
*/
@@ -136,4 +206,20 @@
return this.autoStop;
}
}
+
+ public static class MBeanServerReferenceLookup implements MBeanServerLookup
+ {
+ // Hacky way to reference injected mbean server
+ static WeakReference<MBeanServer> serverRef;
+
+ /**
+ * {@inheritDoc}
+ * @see org.infinispan.jmx.MBeanServerLookup#getMBeanServer()
+ */
+ @Override
+ public MBeanServer getMBeanServer()
+ {
+ return serverRef.get();
+ }
+ }
}
Modified: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainerRegistry.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainerRegistry.java 2010-11-10 19:56:31 UTC (rev 109245)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainerRegistry.java 2010-11-10 20:16:31 UTC (rev 109246)
@@ -21,34 +21,22 @@
*/
package org.jboss.ha.ispn;
-import java.lang.management.ManagementFactory;
import java.util.Collections;
import java.util.List;
-import java.util.Locale;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicReference;
-import javax.management.JMException;
-import javax.management.MBeanServer;
-import javax.management.ObjectName;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.Name;
import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
-import org.infinispan.config.Configuration;
import org.infinispan.config.GlobalConfiguration;
-import org.infinispan.jmx.CacheJmxRegistration;
-import org.infinispan.jmx.ComponentsJmxRegistration;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.notifications.Listener;
-import org.infinispan.notifications.cachemanagerlistener.annotation.CacheStarted;
-import org.infinispan.notifications.cachemanagerlistener.annotation.CacheStopped;
-import org.infinispan.notifications.cachemanagerlistener.event.CacheStartedEvent;
-import org.infinispan.notifications.cachemanagerlistener.event.CacheStoppedEvent;
import org.jboss.ha.ispn.config.CacheContainerRegistryConfiguration;
import org.jboss.ha.ispn.config.CacheContainerRegistryConfigurationEntry;
import org.jboss.ha.ispn.config.CacheContainerRegistryConfigurationSource;
@@ -65,7 +53,7 @@
{
public static final String DEFAULT_CACHE_MANAGER_NAME = new GlobalConfiguration().getCacheManagerName();
- static Logger logger = Logger.getLogger(DefaultCacheContainerRegistry.class);
+ private static Logger logger = Logger.getLogger(DefaultCacheContainerRegistry.class);
// Used to provide access to registry where injection is not an option
private static final AtomicReference<CacheContainerRegistry> singleton = new AtomicReference<CacheContainerRegistry>();
@@ -79,7 +67,6 @@
private final ConcurrentMap<String, String> aliases = new ConcurrentHashMap<String, String>();
private final ConcurrentMap<String, CacheContainerRegistryEntry> containers = new ConcurrentHashMap<String, CacheContainerRegistryEntry>();
- private volatile MBeanServer server = ManagementFactory.getPlatformMBeanServer();
private volatile String jndiNamePrefix = null;
private volatile EmbeddedCacheManager defaultContainer;
@@ -104,11 +91,6 @@
this.jndiNamePrefix = jndiNamePrefix;
}
- public void setMBeanServer(MBeanServer server)
- {
- this.server = server;
- }
-
public void start() throws Exception
{
CacheContainerRegistryConfiguration registry = this.source.getRegistryConfiguration();
@@ -249,7 +231,7 @@
{
EmbeddedCacheManager container = entry.getContainer();
container.start();
- container.addListener(this);
+ container.addListener(this.factory);
String jndiName = entry.getJndiName();
@@ -285,7 +267,7 @@
}
EmbeddedCacheManager container = entry.getContainer();
- container.removeListener(this);
+ container.removeListener(this.factory);
container.stop();
}
@@ -319,52 +301,6 @@
NonSerializableFactory.unbind(name);
}
- @CacheStarted
- public void cacheStarted(CacheStartedEvent event)
- {
- log("Started", event.getCacheName(), event.getCacheManager());
- }
-
- @CacheStopped
- public void cacheStopped(CacheStoppedEvent event)
- {
- String cacheName = event.getCacheName();
- EmbeddedCacheManager container = event.getCacheManager();
-
- log("Stopped", cacheName, container);
-
- // Infinispan does not unregister cache mbean when cache stops (only when cache manager is stopped), so do it now to avoid classloader leaks
- Configuration configuration = container.defineConfiguration(cacheName, new Configuration());
- if (configuration.isExposeJmxStatistics())
- {
- GlobalConfiguration global = container.getGlobalConfiguration();
- String domain = global.getJmxDomain();
- String jmxCacheName = String.format("%s(%s)", cacheName, configuration.getCacheModeString().toLowerCase(Locale.ENGLISH));
- String containerName = global.getCacheManagerName();
-
- try
- {
- // Fragile code alert!
- ObjectName name = ObjectName.getInstance(String.format("%s:%s,%s=%s,manager=%s,%s=%s", domain, CacheJmxRegistration.CACHE_JMX_GROUP, ComponentsJmxRegistration.NAME_KEY, ObjectName.quote(jmxCacheName), ObjectName.quote(containerName), ComponentsJmxRegistration.COMPONENT_KEY, "Cache"));
-
- if (this.server.isRegistered(name))
- {
- this.server.unregisterMBean(name);
- logger.debug(String.format("Unregistered cache mbean: %s", name));
- }
- }
- catch (JMException e)
- {
- logger.warn(String.format("Failed to unregister mbean for %s cache", cacheName), e);
- }
- }
- }
-
- private static void log(String event, String cacheName, EmbeddedCacheManager container)
- {
- logger.info(String.format("%s \"%s\" cache from \"%s\" container", event, cacheName, container.getGlobalConfiguration().getCacheManagerName()));
- }
-
static class CacheContainerRegistryEntry
{
private final String id;
Modified: projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/DefaultCacheContainerFactoryTest.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/DefaultCacheContainerFactoryTest.java 2010-11-10 19:56:31 UTC (rev 109245)
+++ projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/DefaultCacheContainerFactoryTest.java 2010-11-10 20:16:31 UTC (rev 109246)
@@ -24,9 +24,12 @@
import java.net.URL;
import java.util.Collections;
+import javax.management.MBeanServer;
+
import junit.framework.Assert;
import org.easymock.EasyMock;
+import org.easymock.IMocksControl;
import org.infinispan.Cache;
import org.infinispan.config.Configuration;
import org.infinispan.config.GlobalConfiguration;
@@ -48,7 +51,9 @@
@Test
public void test() throws Exception
{
- ChannelFactory channelFactory = EasyMock.createStrictMock(ChannelFactory.class);
+ IMocksControl control = EasyMock.createStrictControl();
+ ChannelFactory channelFactory = control.createMock(ChannelFactory.class);
+ MBeanServer server = control.createMock(MBeanServer.class);
GlobalConfiguration globalConfiguration = new GlobalConfiguration();
globalConfiguration.setTransportClass(JGroupsTransport.class.getName());
@@ -58,7 +63,7 @@
Configuration namedConfiguration = new NamedConfiguration("custom");
CacheContainerConfiguration configuration = new CacheContainerConfiguration(globalConfiguration, defaultConfiguration, Collections.singletonList(namedConfiguration));
- CacheContainerFactory factory = new DefaultCacheContainerFactory(channelFactory);
+ CacheContainerFactory factory = new DefaultCacheContainerFactory(channelFactory, server);
CacheContainer result = factory.createCacheContainer(configuration);
@@ -67,13 +72,13 @@
URL url = Thread.currentThread().getContextClassLoader().getResource("config-samples/jgroups-udp.xml");
EasyMock.expect(channelFactory.createMultiplexerChannel(DefaultCacheContainerFactory.ChannelFactoryChannelLookup.DEFAULT_STACK, "mychannel")).andReturn(new JChannel(url));
- EasyMock.replay(channelFactory);
+ control.replay();
Cache<?, ?> cache = result.getCache();
try
{
- EasyMock.verify(channelFactory);
+ control.verify();
Assert.assertSame(ComponentStatus.RUNNING, cache.getStatus());
Modified: projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/DefaultCacheContainerRegistryTest.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/DefaultCacheContainerRegistryTest.java 2010-11-10 19:56:31 UTC (rev 109245)
+++ projects/cluster/ha-server-ispn/trunk/src/test/java/org/jboss/ha/ispn/DefaultCacheContainerRegistryTest.java 2010-11-10 20:16:31 UTC (rev 109246)
@@ -133,7 +133,7 @@
EasyMock.expect(factory.createCacheContainer(EasyMock.same(defaultConfig))).andReturn(defaultContainer);
defaultContainer.start();
- defaultContainer.addListener(EasyMock.same(registry));
+ defaultContainer.addListener(EasyMock.same(factory));
EasyMock.expect(context.getNameParser("")).andReturn(parser);
EasyMock.expect(parser.parse("java:CacheManager/default")).andReturn(name);
@@ -146,7 +146,7 @@
EasyMock.expect(factory.createCacheContainer(EasyMock.same(otherConfig))).andReturn(otherContainer);
otherContainer.start();
- otherContainer.addListener(EasyMock.same(registry));
+ otherContainer.addListener(EasyMock.same(factory));
EasyMock.expect(context.getNameParser("")).andReturn(parser);
EasyMock.expect(parser.parse("java:CacheManager/other")).andReturn(name);
@@ -194,10 +194,10 @@
context.unbind("java:CacheManager/default");
defaultContainer.stop();
- defaultContainer.removeListener(EasyMock.same(registry));
+ defaultContainer.removeListener(EasyMock.same(factory));
context.unbind("java:CacheManager/other");
otherContainer.stop();
- otherContainer.removeListener(EasyMock.same(registry));
+ otherContainer.removeListener(EasyMock.same(factory));
this.control.replay();
@@ -257,7 +257,7 @@
EasyMock.expect(factory.createCacheContainer(EasyMock.same(otherConfig))).andReturn(otherContainer);
otherContainer.start();
- otherContainer.addListener(EasyMock.same(registry));
+ otherContainer.addListener(EasyMock.same(factory));
EasyMock.expect(context.getNameParser("")).andReturn(parser);
EasyMock.expect(parser.parse("java:other")).andReturn(name);
@@ -267,7 +267,7 @@
EasyMock.expect(factory.createCacheContainer(EasyMock.same(defaultConfig))).andReturn(defaultContainer);
defaultContainer.start();
- defaultContainer.addListener(EasyMock.same(registry));
+ defaultContainer.addListener(EasyMock.same(factory));
EasyMock.expect(context.getNameParser("")).andReturn(parser);
EasyMock.expect(parser.parse("java:Infinispan/default")).andReturn(name);
@@ -317,10 +317,10 @@
context.unbind("java:Infinispan/default");
defaultContainer.stop();
- defaultContainer.removeListener(EasyMock.same(registry));
+ defaultContainer.removeListener(EasyMock.same(factory));
context.unbind("java:other");
otherContainer.stop();
- otherContainer.removeListener(EasyMock.same(registry));
+ otherContainer.removeListener(EasyMock.same(factory));
this.control.replay();
More information about the jboss-cvs-commits
mailing list