[jboss-svn-commits] JBL Code SVN: r13809 - in labs/jbossesb/trunk/product/rosetta/src/org/jboss: soa/esb/couriers and 4 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri Jul 27 11:35:40 EDT 2007
Author: kevin.conner at jboss.com
Date: 2007-07-27 11:35:40 -0400 (Fri, 27 Jul 2007)
New Revision: 13809
Modified:
labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/rosetta/pooling/JmsConnectionPoolContainer.java
labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/couriers/CourierFactory.java
labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/lifecycle/LifecycleIdentity.java
labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/HibernateInterceptor.java
labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/JBossRemotingGatewayListener.java
labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/jca/JcaInflowGateway.java
labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/lifecycle/AbstractManagedLifecycle.java
labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/lifecycle/ManagedLifecycleController.java
Log:
Rewrite lifecycle identity association: JBESB-760
Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/rosetta/pooling/JmsConnectionPoolContainer.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/rosetta/pooling/JmsConnectionPoolContainer.java 2007-07-27 15:16:11 UTC (rev 13808)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/internal/soa/esb/rosetta/pooling/JmsConnectionPoolContainer.java 2007-07-27 15:35:40 UTC (rev 13809)
@@ -161,7 +161,7 @@
* @return The map being removed.
*/
private static synchronized Map<Map<String, String>, JmsConnectionPool> removePoolMap() {
- final String lifecycleIdentity = LifecycleIdentity.getSingleton().getThreadLifecycleIdentity() ;
+ final String lifecycleIdentity = LifecycleIdentity.getSingleton().getLifecycleIdentity() ;
return poolMaps.remove(lifecycleIdentity) ;
}
@@ -170,7 +170,7 @@
* @return The pool map or null if not present.
*/
private static synchronized Map<Map<String, String>, JmsConnectionPool> getPoolMap() {
- final String lifecycleIdentity = LifecycleIdentity.getSingleton().getThreadLifecycleIdentity() ;
+ final String lifecycleIdentity = LifecycleIdentity.getSingleton().getLifecycleIdentity() ;
return poolMaps.get(lifecycleIdentity) ;
}
@@ -179,7 +179,7 @@
* @return The pool map.
*/
private static synchronized Map<Map<String, String>, JmsConnectionPool> getOrCreatePoolMap() {
- final String lifecycleIdentity = LifecycleIdentity.getSingleton().getThreadLifecycleIdentity() ;
+ final String lifecycleIdentity = LifecycleIdentity.getSingleton().getLifecycleIdentity() ;
Map<Map<String, String>, JmsConnectionPool> map = poolMaps.get(lifecycleIdentity) ;
if (map == null)
{
Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/couriers/CourierFactory.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/couriers/CourierFactory.java 2007-07-27 15:16:11 UTC (rev 13808)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/couriers/CourierFactory.java 2007-07-27 15:35:40 UTC (rev 13809)
@@ -179,7 +179,7 @@
*/
private static synchronized Map<TwoWayCourier, Exception> getMap()
{
- final String lifecycleIdentity = LifecycleIdentity.getSingleton().getThreadLifecycleIdentity() ;
+ final String lifecycleIdentity = LifecycleIdentity.getSingleton().getLifecycleIdentity() ;
Map<TwoWayCourier, Exception> map = lifecycleCouriers.get(lifecycleIdentity) ;
if (map == null)
{
@@ -194,7 +194,7 @@
*/
private static synchronized Map<TwoWayCourier, Exception> getAndClearMap()
{
- final String lifecycleIdentity = LifecycleIdentity.getSingleton().getThreadLifecycleIdentity() ;
+ final String lifecycleIdentity = LifecycleIdentity.getSingleton().getLifecycleIdentity() ;
Map<TwoWayCourier, Exception> map = lifecycleCouriers.get(lifecycleIdentity) ;
final String key ;
if (map != null)
@@ -231,7 +231,7 @@
if (couriers.size() > 0)
{
LOGGER.warn("Calling cleanup on existing couriers for identity " +
- LifecycleIdentity.getSingleton().getThreadLifecycleIdentity()) ;
+ LifecycleIdentity.getSingleton().getLifecycleIdentity()) ;
final Iterator<Entry<TwoWayCourier, Exception>> entryIter = couriers.entrySet().iterator() ;
while(entryIter.hasNext())
{
Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/lifecycle/LifecycleIdentity.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/lifecycle/LifecycleIdentity.java 2007-07-27 15:16:11 UTC (rev 13808)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/lifecycle/LifecycleIdentity.java 2007-07-27 15:35:40 UTC (rev 13809)
@@ -21,6 +21,10 @@
*/
package org.jboss.soa.esb.lifecycle;
+import java.util.Collections;
+import java.util.Map;
+import java.util.WeakHashMap;
+
/**
* Utility to handle lifecycle identities.
* @author kevin
@@ -33,44 +37,47 @@
private static final LifecycleIdentity SINGLETON = new LifecycleIdentity() ;
/**
- * The lifecycle identity associated with the current thread.
+ * The map of classloaders to lifecycle identities.
*/
- private static final InheritableThreadLocal<String> threadLifecycleIdentiy = new InheritableThreadLocal<String>() ;
+ private static final Map<ClassLoader, String> classLoaderLifecycleIdentity = Collections.synchronizedMap(new WeakHashMap<ClassLoader, String>()) ;
/**
* The identity counter.
*/
private long identifyCounter ;
- public String getNextLifecycleIdentity()
+ public String associateLifecycleIdentity()
{
final long lifecycleIdentity ;
synchronized(this)
{
lifecycleIdentity = identifyCounter++ ;
}
- return "LifecycleIdentity:" + Long.valueOf(lifecycleIdentity) ;
+ final String lifecycleIdentityVal = "LifecycleIdentity:" + Long.valueOf(lifecycleIdentity) ;
+ setLifecycleIdentity(lifecycleIdentityVal) ;
+ return lifecycleIdentityVal ;
}
/**
- * Set the lifecycle identity associated with the current thread.
+ * Set the lifecycle identity associated with the current context classloader.
* @param lifecycleIdentity The lifecycle identity or null to clear.
*/
- public void setThreadLifecycleIdentity(final String lifecycleIdentity)
+ public void setLifecycleIdentity(final String lifecycleIdentity)
{
- threadLifecycleIdentiy.set(lifecycleIdentity) ;
+ final ClassLoader classLoader = Thread.currentThread().getContextClassLoader() ;
+ classLoaderLifecycleIdentity.put(classLoader, lifecycleIdentity) ;
}
/**
- * Get the lifecycle identity associated with the current thread.
+ * Get the lifecycle identity associated with the current context classloader.
* @return The lifecycle identity or null if not set.
*/
- public String getThreadLifecycleIdentity()
+ public String getLifecycleIdentity()
{
- return threadLifecycleIdentiy.get() ;
+ final ClassLoader classLoader = Thread.currentThread().getContextClassLoader() ;
+ return classLoaderLifecycleIdentity.get(classLoader) ;
}
-
/**
* Get the lifecycle identify singleton.
* @return the lifecycle identity singleton.
Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/HibernateInterceptor.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/HibernateInterceptor.java 2007-07-27 15:16:11 UTC (rev 13808)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/HibernateInterceptor.java 2007-07-27 15:35:40 UTC (rev 13809)
@@ -42,7 +42,6 @@
import org.jboss.soa.esb.couriers.CourierFactory;
import org.jboss.soa.esb.couriers.CourierUtil;
import org.jboss.soa.esb.helpers.ConfigTree;
-import org.jboss.soa.esb.lifecycle.LifecycleIdentity;
import org.jboss.soa.esb.listeners.ListenerTagNames;
import org.jboss.soa.esb.listeners.ListenerUtil;
import org.jboss.soa.esb.listeners.RegistryUtil;
@@ -77,8 +76,6 @@
protected Collection<EPR> m_targetEprs;
protected String m_targetServiceCategory, m_targetServiceName;
- private final String m_activeIdentity ;
-
// Event Strings
private static final String DELETE_EVENT = "onDelete";
private static final String SAVE_EVENT = "onSave";
@@ -98,7 +95,6 @@
public HibernateInterceptor(ConfigTree f_config, ArrayList<HibernateEventBean> f_list) throws ManagedLifecycleException {
m_config = f_config;
m_events = f_list;
- m_activeIdentity = LifecycleIdentity.getSingleton().getThreadLifecycleIdentity() ;
try {
m_targetServiceCategory = ListenerUtil.obtainAtt(m_config,
@@ -130,10 +126,7 @@
*/
private Message createMessage(Object messageObject) {
Object obj = null;
- final LifecycleIdentity lifecycleIdentity = LifecycleIdentity.getSingleton() ;
- final String currentIdentity = lifecycleIdentity.getThreadLifecycleIdentity() ;
try {
- lifecycleIdentity.setThreadLifecycleIdentity(m_activeIdentity) ;
obj = m_processMethod.invoke(m_composer, new Object[] { messageObject });
if (null == obj) {
m_logger.error("Action class method <" + m_processMethod
@@ -145,8 +138,6 @@
m_logger.error("Error creating message", e);
} catch (InvocationTargetException e) {
m_logger.error("Error creating message", e);
- } finally {
- lifecycleIdentity.setThreadLifecycleIdentity(currentIdentity) ;
}
Message message = (Message) obj;
return message;
@@ -159,11 +150,8 @@
private void deliverMessage(Message message) {
Throwable thrown = null;
String text = null;
- final LifecycleIdentity lifecycleIdentity = LifecycleIdentity.getSingleton() ;
- final String currentIdentity = lifecycleIdentity.getThreadLifecycleIdentity() ;
try {
- lifecycleIdentity.setThreadLifecycleIdentity(m_activeIdentity) ;
boolean bSent = false;
for (EPR current : m_targetEprs) {
m_courier = CourierFactory.getCourier(current);
@@ -194,8 +182,6 @@
} catch (IllegalArgumentException e) {
thrown = e;
text = "Courier <" + m_courier.getClass().getName() + ".deliverAsync(Message) FAILED with IllegalArgumentException.";
- } finally {
- lifecycleIdentity.setThreadLifecycleIdentity(currentIdentity) ;
}
if (null != thrown) {
m_logger.error(text);
Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/JBossRemotingGatewayListener.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/JBossRemotingGatewayListener.java 2007-07-27 15:16:11 UTC (rev 13808)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/gateway/JBossRemotingGatewayListener.java 2007-07-27 15:35:40 UTC (rev 13809)
@@ -42,7 +42,6 @@
import org.jboss.soa.esb.addressing.EPR;
import org.jboss.soa.esb.helpers.ConfigTree;
import org.jboss.soa.esb.helpers.KeyValuePair;
-import org.jboss.soa.esb.lifecycle.LifecycleIdentity;
import org.jboss.soa.esb.listeners.ListenerTagNames;
import org.jboss.soa.esb.listeners.lifecycle.AbstractManagedLifecycle;
import org.jboss.soa.esb.listeners.lifecycle.ManagedLifecycleException;
@@ -299,10 +298,7 @@
* @throws Throwable Message processing failure.
*/
public Object invoke(InvocationRequest invocationRequest) throws Throwable {
- final LifecycleIdentity lifecycleIdentity = LifecycleIdentity.getSingleton() ;
- final String currentIdentity = lifecycleIdentity.getThreadLifecycleIdentity() ;
try {
- lifecycleIdentity.setThreadLifecycleIdentity(getLifecycleIdentity()) ;
if (synchronous) {
Object response = messageDeliveryAdapter.deliverSync(invocationRequest, 20000); // TODO Fix magic number
if(logger.isDebugEnabled()) {
@@ -318,8 +314,6 @@
messageDeliveryAdapter.getDeliveryAdapter().getServiceName() + "].", t);
throw t;
- } finally {
- lifecycleIdentity.setThreadLifecycleIdentity(currentIdentity) ;
}
return "<ack/>";
Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/jca/JcaInflowGateway.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/jca/JcaInflowGateway.java 2007-07-27 15:16:11 UTC (rev 13808)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/jca/JcaInflowGateway.java 2007-07-27 15:35:40 UTC (rev 13809)
@@ -29,7 +29,6 @@
import org.jboss.soa.esb.ConfigurationException;
import org.jboss.soa.esb.services.registry.RegistryException;
import org.jboss.soa.esb.helpers.ConfigTree;
-import org.jboss.soa.esb.lifecycle.LifecycleIdentity;
import org.jboss.soa.esb.listeners.ListenerTagNames;
import org.jboss.soa.esb.listeners.ListenerUtil;
import org.jboss.soa.esb.listeners.ServiceInvoker;
@@ -193,11 +192,8 @@
public Object invoke(Method method, Object[] args) throws Throwable
{
- final LifecycleIdentity lifecycleIdentity = LifecycleIdentity.getSingleton() ;
- final String currentIdentity = lifecycleIdentity.getThreadLifecycleIdentity() ;
try
{
- lifecycleIdentity.setThreadLifecycleIdentity(getLifecycleIdentity()) ;
return method.invoke(theBean, args);
}
catch (IllegalAccessException e)
@@ -208,10 +204,6 @@
{
throw e.getTargetException();
}
- finally
- {
- lifecycleIdentity.setThreadLifecycleIdentity(currentIdentity) ;
- }
}
public boolean isDeliveryTransacted(Method method) throws NoSuchMethodException
Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/lifecycle/AbstractManagedLifecycle.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/lifecycle/AbstractManagedLifecycle.java 2007-07-27 15:16:11 UTC (rev 13808)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/lifecycle/AbstractManagedLifecycle.java 2007-07-27 15:35:40 UTC (rev 13809)
@@ -34,7 +34,6 @@
import org.apache.log4j.Logger;
import org.jboss.soa.esb.ConfigurationException;
import org.jboss.soa.esb.helpers.ConfigTree;
-import org.jboss.soa.esb.lifecycle.LifecycleIdentity;
/**
* This class represents the lifecycle for a managed instance.
@@ -78,10 +77,6 @@
* Instance configuration. Supplied through constructor.
*/
private final ConfigTree config;
- /**
- * The identity of the lifecycle we are attached to.
- */
- private final String lifecycleIdentity ;
/**
* Lifecycle controller for this lifecycle.
@@ -117,8 +112,6 @@
this.config = config;
- lifecycleIdentity = LifecycleIdentity.getSingleton().getThreadLifecycleIdentity() ;
-
lifecycleController = new LifecycleController(this, config);
lifecycleController.registerMBean();
}
@@ -484,13 +477,4 @@
{
return config;
}
-
- /**
- * Get the lifecycle identity we are attached to.
- * @return The lifecycle identity.
- */
- protected String getLifecycleIdentity()
- {
- return lifecycleIdentity ;
- }
}
Modified: labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/lifecycle/ManagedLifecycleController.java
===================================================================
--- labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/lifecycle/ManagedLifecycleController.java 2007-07-27 15:16:11 UTC (rev 13808)
+++ labs/jbossesb/trunk/product/rosetta/src/org/jboss/soa/esb/listeners/lifecycle/ManagedLifecycleController.java 2007-07-27 15:35:40 UTC (rev 13809)
@@ -64,7 +64,8 @@
} else {
instances = lifecycles.toArray(new ManagedLifecycle[lifecycles.size()]);
}
- lifecycleIdentity = LifecycleIdentity.getSingleton().getNextLifecycleIdentity() ;
+ lifecycleIdentity = LifecycleIdentity.getSingleton().associateLifecycleIdentity() ;
+
CourierFactory.initialiseLifecycleIdentityMap(lifecycleIdentity) ;
}
@@ -78,23 +79,15 @@
public void start()
throws ManagedLifecycleException
{
- final LifecycleIdentity lifecycleIdentitySingleton = LifecycleIdentity.getSingleton() ;
- final String currentIdentity = lifecycleIdentitySingleton.getThreadLifecycleIdentity() ;
-
- try
- {
- lifecycleIdentitySingleton.setThreadLifecycleIdentity(lifecycleIdentity) ;
- initialiseInstances();
- startInstances();
+ initialiseInstances();
+ startInstances();
+ try {
if(scheduleProvider != null) {
scheduleProvider.start();
}
} catch (SchedulingException e) {
- stopInstances();
+ stopAndDestroy(false);
throw new ManagedLifecycleException("Failed to start schedule provider.", e);
- } finally
- {
- lifecycleIdentitySingleton.setThreadLifecycleIdentity(currentIdentity) ;
}
}
@@ -107,24 +100,24 @@
*/
public void restart() throws ManagedLifecycleException
{
- final LifecycleIdentity lifecycleIdentitySingleton = LifecycleIdentity.getSingleton() ;
- final String currentIdentity = lifecycleIdentitySingleton.getThreadLifecycleIdentity() ;
try
{
if(scheduleProvider != null) {
scheduleProvider.standby();
}
- lifecycleIdentitySingleton.setThreadLifecycleIdentity(lifecycleIdentity) ;
- stopInstances();
- startInstances();
+ } catch (SchedulingException e) {
+ stopAndDestroy(false);
+ throw new ManagedLifecycleException("Failed to put schedule provider into standby.", e);
+ }
+ stopInstances();
+ startInstances();
+ try {
if(scheduleProvider != null) {
scheduleProvider.start();
- }
+ }
} catch (SchedulingException e) {
- stopInstances();
+ stopAndDestroy(false);
throw new ManagedLifecycleException("Failed to restart schedule provider.", e);
- } finally {
- lifecycleIdentitySingleton.setThreadLifecycleIdentity(currentIdentity) ;
}
}
@@ -137,10 +130,12 @@
*/
public void stop() throws ManagedLifecycleException
{
- final LifecycleIdentity lifecycleIdentitySingleton = LifecycleIdentity.getSingleton() ;
- final String currentIdentity = lifecycleIdentitySingleton.getThreadLifecycleIdentity() ;
try
{
+ stopAndDestroy(true) ;
+ }
+ finally
+ {
if(scheduleProvider != null) {
try {
scheduleProvider.stop();
@@ -148,27 +143,7 @@
logger.error("Failed to stop scheduling.", e);
}
}
- lifecycleIdentitySingleton.setThreadLifecycleIdentity(lifecycleIdentity) ;
- stopInstances();
- destroyInstances();
-
- // Cleanup resources.
- CourierFactory.releaseCouriers() ;
- CourierFactory.destroyLifecycleIdentityMap(lifecycleIdentity) ;
- try
- {
- JmsConnectionPoolContainer.removeAllPools() ;
- }
- catch (final JMSException jmse)
- {
- throw new ManagedLifecycleException("Unexpected exception clearing JMS pools", jmse) ;
- }
- NamingContext.closeAllContexts();
}
- finally
- {
- lifecycleIdentitySingleton.setThreadLifecycleIdentity(currentIdentity) ;
- }
}
/**
@@ -193,6 +168,7 @@
{
destroyInstances(count - 1);
}
+ cleanupResources() ;
throw mle;
}
}
@@ -221,6 +197,7 @@
stopInstances(count - 1);
destroyInstances(numInstances - 1);
}
+ cleanupResources() ;
throw mle;
}
}
@@ -249,6 +226,7 @@
stopInstances(count - 1);
destroyInstances(numInstances - 1);
}
+ cleanupResources() ;
throw mle;
}
}
@@ -263,22 +241,29 @@
throws ManagedLifecycleException
{
final int numInstances = instances.length;
- for (int count = numInstances - 1; count >= 0; count--)
+ try
{
- final ManagedLifecycle instance = instances[count];
- try
- {
- instance.destroy();
- }
- catch (final ManagedLifecycleException mle)
- {
- if (count > 0)
- {
- destroyInstances(count - 1);
- }
- throw mle;
- }
+ for (int count = numInstances - 1; count >= 0; count--)
+ {
+ final ManagedLifecycle instance = instances[count];
+ try
+ {
+ instance.destroy();
+ }
+ catch (final ManagedLifecycleException mle)
+ {
+ if (count > 0)
+ {
+ destroyInstances(count - 1);
+ }
+ throw mle;
+ }
+ }
}
+ finally
+ {
+ cleanupResources() ;
+ }
}
/**
@@ -287,7 +272,6 @@
* @param firstInstance The index of the first instance to stop
*/
private void stopInstances(final int firstInstance)
- throws ManagedLifecycleException
{
for (int count = firstInstance; count >= 0; count--)
{
@@ -308,7 +292,6 @@
* @param firstInstance The index of the first instance to stop
*/
private void destroyInstances(final int firstInstance)
- throws ManagedLifecycleException
{
for (int count = firstInstance; count >= 0; count--)
{
@@ -321,7 +304,49 @@
{
} // Ignore exception
}
+ cleanupResources() ;
}
+
+ /**
+ * Stop and destroy all lifecycles, cleaning up resources.
+ * @param throwExceptions true if exceptions can be throw, false otherwise.
+ */
+ private void stopAndDestroy(final boolean throwExceptions)
+ throws ManagedLifecycleException
+ {
+ if (throwExceptions)
+ {
+ stopInstances() ;
+ destroyInstances() ;
+ }
+ else
+ {
+ final int numInstances = instances.length;
+ stopInstances(numInstances-1) ;
+ destroyInstances(numInstances-1) ;
+ }
+ }
+
+ /**
+ * Cleanup resources associated with this lifecycle controller.
+ */
+ private void cleanupResources()
+ {
+ CourierFactory.releaseCouriers() ;
+ CourierFactory.destroyLifecycleIdentityMap(lifecycleIdentity) ;
+ try
+ {
+ JmsConnectionPoolContainer.removeAllPools() ;
+ }
+ catch (final JMSException jmse)
+ {
+ if (logger.isDebugEnabled())
+ {
+ logger.debug("Unexpected exception clearing JMS pools", jmse) ;
+ }
+ }
+ NamingContext.closeAllContexts();
+ }
public void setScheduleProvider(ScheduleProvider scheduleProvider) {
this.scheduleProvider = scheduleProvider;
More information about the jboss-svn-commits
mailing list