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@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;
+ });
}
}
Show replies by date