[hornetq-commits] JBoss hornetq SVN: r12285 - trunk/hornetq-ra/hornetq-ra-jar/src/main/java/org/hornetq/ra/recovery.

do-not-reply at jboss.org do-not-reply at jboss.org
Fri Mar 9 17:40:16 EST 2012


Author: clebert.suconic
Date: 2012-03-09 17:40:15 -0500 (Fri, 09 Mar 2012)
New Revision: 12285

Modified:
   trunk/hornetq-ra/hornetq-ra-jar/src/main/java/org/hornetq/ra/recovery/RecoveryManager.java
Log:
JBPAPP-8366 & JBPAPP-8377 - fixing leaks and duplicated resources 

Modified: trunk/hornetq-ra/hornetq-ra-jar/src/main/java/org/hornetq/ra/recovery/RecoveryManager.java
===================================================================
--- trunk/hornetq-ra/hornetq-ra-jar/src/main/java/org/hornetq/ra/recovery/RecoveryManager.java	2012-03-09 22:39:47 UTC (rev 12284)
+++ trunk/hornetq-ra/hornetq-ra-jar/src/main/java/org/hornetq/ra/recovery/RecoveryManager.java	2012-03-09 22:40:15 UTC (rev 12285)
@@ -21,18 +21,18 @@
 */
 package org.hornetq.ra.recovery;
 
-import org.hornetq.api.core.DiscoveryGroupConfiguration;
-import org.hornetq.api.core.TransportConfiguration;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.Set;
+
 import org.hornetq.core.logging.Logger;
 import org.hornetq.jms.client.HornetQConnectionFactory;
 import org.hornetq.jms.server.recovery.HornetQResourceRecovery;
 import org.hornetq.jms.server.recovery.RecoveryRegistry;
 import org.hornetq.jms.server.recovery.XARecoveryConfig;
-import org.hornetq.ra.Util;
+import org.hornetq.utils.ClassloadingUtil;
+import org.hornetq.utils.ConcurrentHashSet;
 
-import java.util.HashMap;
-import java.util.Map;
-
 /**
  * @author <a href="mailto:andy.taylor at jboss.org">Andy Taylor</a>
  *         9/21/11
@@ -43,10 +43,10 @@
 
    private RecoveryRegistry registry;
 
-   private String resourceRecoveryClassNames = "org.jboss.as.integration.hornetq.recovery.AS5RecoveryRegistry";
+   private String resourceRecoveryClassNames = "org.jboss.as.messaging.jms.AS7RecoveryRegistry;org.jboss.as.integration.hornetq.recovery.AS5RecoveryRegistry";
+   
+   private final Set<HornetQResourceRecovery> resources = new ConcurrentHashSet<HornetQResourceRecovery>(); 
 
-   private Map<XARecoveryConfig, HornetQResourceRecovery> configMap = new HashMap<XARecoveryConfig, HornetQResourceRecovery>();
-
    public void start()
    {
       locateRecoveryRegistry();
@@ -54,17 +54,47 @@
 
    public HornetQResourceRecovery register(HornetQConnectionFactory factory, String userName, String password)
    {
-      if(!isRegistered(factory) && registry != null)
+      log.debug("registering recovery for factory : " + factory);
+      
+      HornetQResourceRecovery resourceRecovery = newResourceRecovery(factory, userName, password);
+      
+      if (registry != null)
       {
-         XARecoveryConfig xaRecoveryConfig = new XARecoveryConfig(factory, userName, password);
-         HornetQResourceRecovery resourceRecovery = new HornetQResourceRecovery(xaRecoveryConfig);
-         registry.register(resourceRecovery);
-         configMap.put(xaRecoveryConfig, resourceRecovery);
-         return resourceRecovery;
+         resourceRecovery = registry.register(resourceRecovery);
+         if (resourceRecovery != null)
+         {
+            resources.add(resourceRecovery);
+         }
       }
-      return null;
+      
+      return resourceRecovery;
    }
 
+   /**
+    * @param factory
+    * @param userName
+    * @param password
+    * @return
+    */
+   private HornetQResourceRecovery newResourceRecovery(HornetQConnectionFactory factory,
+                                                       String userName,
+                                                       String password)
+   {
+      XARecoveryConfig xaRecoveryConfig;
+
+      if (factory.getServerLocator().getDiscoveryGroupConfiguration() != null)
+      {
+         xaRecoveryConfig = new XARecoveryConfig(factory.getServerLocator().isHA(), factory.getServerLocator().getDiscoveryGroupConfiguration(), userName, password);
+      }
+      else
+      {
+         xaRecoveryConfig = new XARecoveryConfig(factory.getServerLocator().isHA(), factory.getServerLocator().getStaticTransportConfigurations(), userName, password);
+      }
+      
+      HornetQResourceRecovery resourceRecovery = new HornetQResourceRecovery(xaRecoveryConfig);
+      return resourceRecovery;
+   }
+
    public void unRegister(HornetQResourceRecovery resourceRecovery)
    {
       registry.unRegister(resourceRecovery);
@@ -72,11 +102,11 @@
 
    public void stop()
    {
-      for (HornetQResourceRecovery hornetQResourceRecovery : configMap.values())
+      for (HornetQResourceRecovery hornetQResourceRecovery : resources)
       {
          registry.unRegister(hornetQResourceRecovery);
       }
-      configMap.clear();
+      resources.clear();
    }
 
    private void locateRecoveryRegistry()
@@ -85,7 +115,14 @@
 
       for (int i = 0 ; i < locatorClasses.length; i++)
       {
-         registry = Util.locateRecoveryRegistry(locatorClasses[i]);
+         try
+         {
+            registry = (RecoveryRegistry) safeInitNewInstance(locatorClasses[i]);
+         }
+         catch (Throwable e)
+         {
+            log.debug("unable to load  recovery registry " + locatorClasses[i], e);
+         }
          if (registry != null)
          {
             break;
@@ -96,9 +133,9 @@
       {
          registry = new RecoveryRegistry()
          {
-            public void register(HornetQResourceRecovery resourceRecovery)
+            public HornetQResourceRecovery register(HornetQResourceRecovery resourceRecovery)
             {
-               //no op
+               return null;
             }
 
             public void unRegister(HornetQResourceRecovery xaRecoveryConfig)
@@ -113,50 +150,19 @@
       }
    }
 
-
-   public boolean isRegistered(HornetQConnectionFactory factory)
+   /** This seems duplicate code all over the place, but for security reasons we can't let something like this to be open in a
+    *  utility class, as it would be a door to load anything you like in a safe VM.
+    *  For that reason any class trying to do a privileged block should do with the AccessController directly.
+    */
+   private static Object safeInitNewInstance(final String className)
    {
-      for (XARecoveryConfig xaRecoveryConfig : configMap.keySet())
+      return AccessController.doPrivileged(new PrivilegedAction<Object>()
       {
-         TransportConfiguration[] transportConfigurations = factory.getServerLocator().getStaticTransportConfigurations();
-
-         if (transportConfigurations != null)
+         public Object run()
          {
-            TransportConfiguration[] xaConfigurations = xaRecoveryConfig.getHornetQConnectionFactory().getServerLocator().getStaticTransportConfigurations();
-            if(xaConfigurations == null)
-            {
-               break;
-            }
-            if(transportConfigurations.length != xaConfigurations.length)
-            {
-               break;
-            }
-            boolean theSame=true;
-            for(int i = 0; i < transportConfigurations.length; i++)
-            {
-              TransportConfiguration tc = transportConfigurations[i];
-              TransportConfiguration xaTc = xaConfigurations[i];
-              if(!tc.equals(xaTc))
-              {
-                 theSame = false;
-                 break;
-              }
-            }
-            if(theSame)
-            {
-               return theSame;
-            }
+            return ClassloadingUtil.newInstanceFromClassLoader(className);
          }
-         else
-         {
-            DiscoveryGroupConfiguration discoveryGroupConfiguration = xaRecoveryConfig.getHornetQConnectionFactory().getServerLocator().getDiscoveryGroupConfiguration();
-            if(discoveryGroupConfiguration != null && discoveryGroupConfiguration.equals(factory.getDiscoveryGroupConfiguration()))
-            {
-               return true;
-            }
-         }
-      }
-      return false;
+      });
    }
 
 }



More information about the hornetq-commits mailing list