[jboss-cvs] JBossAS SVN: r108972 - projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Oct 28 13:18:01 EDT 2010


Author: pferraro
Date: 2010-10-28 13:18:01 -0400 (Thu, 28 Oct 2010)
New Revision: 108972

Modified:
   projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainer.java
Log:
ISPN-744 workaround
In CacheStopped event handler, execute manager.stop() is separate thread to avoid rejected execution exceptions.

Modified: projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainer.java
===================================================================
--- projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainer.java	2010-10-28 17:16:57 UTC (rev 108971)
+++ projects/cluster/ha-server-ispn/trunk/src/main/java/org/jboss/ha/ispn/DefaultCacheContainer.java	2010-10-28 17:18:01 UTC (rev 108972)
@@ -26,6 +26,8 @@
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 import org.infinispan.Cache;
 import org.infinispan.config.Configuration;
@@ -47,6 +49,8 @@
 {
    private final EmbeddedCacheManager container;
    private final ConcurrentMap<String, EmbeddedCacheManager> containers = new ConcurrentHashMap<String, EmbeddedCacheManager>();
+
+   private ExecutorService executor;
    
    public DefaultCacheContainer(EmbeddedCacheManager manager)
    {
@@ -76,8 +80,29 @@
          
          if (container == null)
          {
-            GlobalConfiguration global = globalConfig.clone();
+            // Workaround for ISPN-744
+            GlobalConfiguration global = new GlobalConfiguration();
+            global.setAllowDuplicateDomains(globalConfig.isAllowDuplicateDomains());
+            global.setAsyncListenerExecutorFactoryClass(globalConfig.getAsyncListenerExecutorFactoryClass());
+            global.setAsyncListenerExecutorProperties(globalConfig.getAsyncListenerExecutorProperties());
+            global.setAsyncTransportExecutorFactoryClass(globalConfig.getAsyncTransportExecutorFactoryClass());
+            global.setAsyncTransportExecutorProperties(globalConfig.getAsyncTransportExecutorProperties());
             global.setClusterName(clusterName);
+            global.setDistributedSyncTimeout(globalConfig.getDistributedSyncTimeout());
+            global.setEvictionScheduledExecutorFactoryClass(globalConfig.getEvictionScheduledExecutorFactoryClass());
+            global.setEvictionScheduledExecutorProperties(globalConfig.getEvictionScheduledExecutorProperties());
+            global.setExposeGlobalJmxStatistics(globalConfig.isExposeGlobalJmxStatistics());
+            global.setJmxDomain(globalConfig.getJmxDomain());
+            global.setMarshallerClass(globalConfig.getMarshallerClass());
+            global.setMarshallVersion(globalConfig.getMarshallVersion());
+            global.setMBeanServerLookup(globalConfig.getMBeanServerLookup());
+            global.setReplicationQueueScheduledExecutorFactoryClass(globalConfig.getReplicationQueueScheduledExecutorFactoryClass());
+            global.setReplicationQueueScheduledExecutorProperties(globalConfig.getReplicationQueueScheduledExecutorProperties());
+            global.setShutdownHookBehavior(globalConfig.getShutdownHookBehavior());
+            global.setStrictPeerToPeer(globalConfig.isStrictPeerToPeer());
+            global.setTransportClass(globalConfig.getTransportClass());
+            global.setTransportNodeName(globalConfig.getTransportNodeName());
+
             Properties properties = new Properties(globalConfig.getTransportProperties());
             properties.setProperty("clusterId", clusterName);
             global.setTransportProperties(properties);
@@ -111,15 +136,20 @@
    }
 
    @Override
-   public void start()
+   public synchronized void start()
    {
+      this.executor = Executors.newSingleThreadExecutor();
       this.container.start();
    }
 
    @Override
-   public void stop()
+   public synchronized void stop()
    {
       this.container.stop();
+      if (this.executor != null)
+      {
+         this.executor.shutdown();
+      }
    }
 
    @Override
@@ -201,11 +231,35 @@
    }
    
    @CacheStopped
-   public void cacheStopped(CacheStoppedEvent event)
+   public synchronized void cacheStopped(CacheStoppedEvent event)
    {
-      EmbeddedCacheManager manager = event.getCacheManager();
+      final EmbeddedCacheManager manager = event.getCacheManager();
+      
       this.containers.remove(manager.getClusterName());
+      
       // Stop the cache manager when its cache stops
-      manager.stop();
+      // Need to invoke in separate thread - to avoid RejectedExecutionException of listener
+      Runnable task = new Runnable()
+      {
+         @Override
+         public void run()
+         {
+            // Synchronize to ensure that parent method has completed
+            synchronized (DefaultCacheContainer.this)
+            {
+               manager.stop();
+            }
+         }
+      };
+      
+      // This shouldn't ever be null here - but just in case
+      if (this.executor != null)
+      {
+         this.executor.submit(task);
+      }
+      else
+      {
+         task.run();
+      }
    }
 }



More information about the jboss-cvs-commits mailing list