[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