On 18 October 2011 21:58, <pmoua...@apache.org> wrote: > Author: pmouawad > Date: Tue Oct 18 20:58:08 2011 > New Revision: 1185853 > > URL: http://svn.apache.org/viewvc?rev=1185853&view=rev > Log: > Bug 52044 - JMS Subscriber used with many threads leads to > javax.naming.NamingException: Something already bound with ActiveMQ > > Performances impact of No Caching of InitialContext are low.
-1 I now think this is the wrong solution, and could have a negative impact. Please revert these changes; we need to discuss further on the dev list. > Modified: > > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/Utils.java > > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/InitialContextFactory.java > > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/Publisher.java > > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/ReceiveSubscriber.java > > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/PublisherSampler.java > > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/SubscriberSampler.java > jakarta/jmeter/trunk/xdocs/changes.xml > > Modified: > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/Utils.java > URL: > http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/Utils.java?rev=1185853&r1=1185852&r2=1185853&view=diff > ============================================================================== > --- > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/Utils.java > (original) > +++ > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/Utils.java > Tue Oct 18 20:58:08 2011 > @@ -39,6 +39,21 @@ import org.apache.log.Logger; > */ > public final class Utils { > > + /** > + * Close context > + * @param closeable {@link Context} > + * @param log {@link Logger} > + */ > + public static void close(Context closeable, Logger log) { > + if (closeable != null){ > + try { > + closeable.close(); > + } catch (Exception e) { > + log.error("Error during close: ", e); > + } > + } > + } > + > public static void close(MessageConsumer closeable, Logger log){ > if (closeable != null){ > try { > @@ -162,5 +177,4 @@ public final class Utils { > } > throw new NamingException("Expected javax.jms.ConnectionFactory, > found "+objfac.getClass().getName()); > } > - > } > > Modified: > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/InitialContextFactory.java > URL: > http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/InitialContextFactory.java?rev=1185853&r1=1185852&r2=1185853&view=diff > ============================================================================== > --- > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/InitialContextFactory.java > (original) > +++ > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/InitialContextFactory.java > Tue Oct 18 20:58:08 2011 > @@ -48,7 +48,9 @@ public class InitialContextFactory { > * @param securityCredentials used to set the property {@link > Context#SECURITY_CREDENTIALS} > * @return the context, never null > * @throws NamingException > + * @{@link Deprecated} No more caching of {@link Context}s > */ > + @Deprecated > public static Context lookupContext(String initialContextFactory, > String providerUrl, boolean useAuth, String securityPrincipal, > String securityCredentials) throws NamingException { > String cacheKey = createKey(initialContextFactory ,providerUrl, > securityPrincipal, securityCredentials); > @@ -88,13 +90,47 @@ public class InitialContextFactory { > } > > /** > + * Create context > + * > + * @param initialContextFactory used to set the property {@link > Context#INITIAL_CONTEXT_FACTORY} > + * @param providerUrl used to set the property {@link > Context#PROVIDER_URL} > + * @param useAuth set true if security is to be used. > + * @param securityPrincipal used to set the property {@link > Context#SECURITY_PRINCIPAL} > + * @param securityCredentials used to set the property {@link > Context#SECURITY_CREDENTIALS} > + * @return the context, never null > + * @throws NamingException > + */ > + private static Context lookupContextNoCache(String initialContextFactory, > + String providerUrl, boolean useAuth, String securityPrincipal, > String securityCredentials) throws NamingException { > + Properties props = new Properties(); > + props.setProperty(Context.INITIAL_CONTEXT_FACTORY, > initialContextFactory); > + props.setProperty(Context.PROVIDER_URL, providerUrl); > + if (useAuth && securityPrincipal != null && securityCredentials != > null > + && securityPrincipal.length() > 0 && > securityCredentials.length() > 0) { > + props.setProperty(Context.SECURITY_PRINCIPAL, securityPrincipal); > + props.setProperty(Context.SECURITY_CREDENTIALS, > securityCredentials); > + log.info("authentication properties set"); > + } > + try { > + return new InitialContext(props); > + } catch (NoClassDefFoundError e){ > + throw new NamingException(e.toString()); > + } catch (Exception e) { > + throw new NamingException(e.toString()); > + } > + } > + > + > + /** > * Create cache key > * @param initialContextFactory > * @param providerUrl > * @param securityPrincipal > * @param securityCredentials > * @return > + *@deprecated No more caching of {@link Context}s > */ > + @Deprecated > private static String createKey(String initialContextFactory, > String providerUrl, String securityPrincipal, > String securityCredentials) { > @@ -138,13 +174,15 @@ public class InitialContextFactory { > throw new NamingException(e.toString()); > } > } else { > - return lookupContext(initialContextFactory, providerUrl, > useAuth, securityPrincipal, securityCredentials); > + return lookupContextNoCache(initialContextFactory, providerUrl, > useAuth, securityPrincipal, securityCredentials); > } > } > > /** > * clear all the InitialContext objects. > + * @deprecated No more caching of {@link Context}s > */ > + @Deprecated > public static void close() { > for (Context ctx : MAP.values()) { > try { > > Modified: > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/Publisher.java > URL: > http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/Publisher.java?rev=1185853&r1=1185852&r2=1185853&view=diff > ============================================================================== > --- > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/Publisher.java > (original) > +++ > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/Publisher.java > Tue Oct 18 20:58:08 2011 > @@ -176,5 +176,6 @@ public class Publisher implements Closea > Utils.close(producer, log); > Utils.close(session, log); > Utils.close(connection, log); > + Utils.close(ctx, log); > } > } > > Modified: > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/ReceiveSubscriber.java > URL: > http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/ReceiveSubscriber.java?rev=1185853&r1=1185852&r2=1185853&view=diff > ============================================================================== > --- > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/ReceiveSubscriber.java > (original) > +++ > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/ReceiveSubscriber.java > Tue Oct 18 20:58:08 2011 > @@ -154,8 +154,9 @@ public class ReceiveSubscriber implement > String durableSubscriptionId, String clientId, String > jmsSelector, boolean useAuth, > String securityPrincipal, String securityCredentials, boolean > useMessageListener) throws NamingException, JMSException { > boolean initSuccess = false; > + Context ctx = null; > try{ > - Context ctx = InitialContextFactory.getContext(useProps, > + ctx = InitialContextFactory.getContext(useProps, > initialContextFactory, providerUrl, useAuth, > securityPrincipal, securityCredentials); > CONN = Utils.getConnection(ctx, connfactory); > if(!isEmpty(clientId)) { > @@ -181,6 +182,7 @@ public class ReceiveSubscriber implement > if(!initSuccess) { > close(); > } > + Utils.close(ctx, log); > } > } > > > Modified: > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/PublisherSampler.java > URL: > http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/PublisherSampler.java?rev=1185853&r1=1185852&r2=1185853&view=diff > ============================================================================== > --- > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/PublisherSampler.java > (original) > +++ > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/PublisherSampler.java > Tue Oct 18 20:58:08 2011 > @@ -26,19 +26,16 @@ import javax.jms.JMSException; > import javax.jms.Message; > import javax.naming.NamingException; > > -import org.apache.jorphan.io.TextFile; > -import org.apache.jmeter.samplers.SampleResult; > -import org.apache.jmeter.services.FileServer; > -import org.apache.jmeter.testelement.TestListener; > -import org.apache.jmeter.util.JMeterUtils; > import org.apache.jmeter.engine.event.LoopIterationEvent; > - > import org.apache.jmeter.protocol.jms.Utils; > -import org.apache.jmeter.protocol.jms.control.gui.JMSPublisherGui; > import org.apache.jmeter.protocol.jms.client.ClientPool; > -import org.apache.jmeter.protocol.jms.client.InitialContextFactory; > import org.apache.jmeter.protocol.jms.client.Publisher; > - > +import org.apache.jmeter.protocol.jms.control.gui.JMSPublisherGui; > +import org.apache.jmeter.samplers.SampleResult; > +import org.apache.jmeter.services.FileServer; > +import org.apache.jmeter.testelement.TestListener; > +import org.apache.jmeter.util.JMeterUtils; > +import org.apache.jorphan.io.TextFile; > import org.apache.jorphan.logging.LoggingManager; > import org.apache.log.Logger; > > @@ -97,7 +94,6 @@ public class PublisherSampler extends Ba > public void testEnded() { > log.debug("PublisherSampler.testEnded called"); > ClientPool.clearClient(); > - InitialContextFactory.close(); > } > > public void testStarted() { > > Modified: > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/SubscriberSampler.java > URL: > http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/SubscriberSampler.java?rev=1185853&r1=1185852&r2=1185853&view=diff > ============================================================================== > --- > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/SubscriberSampler.java > (original) > +++ > jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/SubscriberSampler.java > Tue Oct 18 20:58:08 2011 > @@ -27,7 +27,6 @@ import javax.naming.NamingException; > > import org.apache.jmeter.engine.event.LoopIterationEvent; > import org.apache.jmeter.protocol.jms.Utils; > -import org.apache.jmeter.protocol.jms.client.InitialContextFactory; > import org.apache.jmeter.protocol.jms.client.ReceiveSubscriber; > import org.apache.jmeter.protocol.jms.control.gui.JMSSubscriberGui; > import org.apache.jmeter.samplers.Interruptible; > @@ -415,7 +414,7 @@ public class SubscriberSampler extends B > * {@inheritDoc} > */ > public void testEnded() { > - InitialContextFactory.close(); > + // NOOP > } > > /** > > Modified: jakarta/jmeter/trunk/xdocs/changes.xml > URL: > http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=1185853&r1=1185852&r2=1185853&view=diff > ============================================================================== > --- jakarta/jmeter/trunk/xdocs/changes.xml (original) > +++ jakarta/jmeter/trunk/xdocs/changes.xml Tue Oct 18 20:58:08 2011 > @@ -97,6 +97,7 @@ Mirror server now uses default port 8081 > <li>Bug 51996 - JMS Initial Context leak newly created Context when Multiple > Thread enter InitialContextFactory#lookupContext at the same time</li> > <li>Bug 51691 - Authorization does not work for JMS Publisher and JMS > Subscriber</li> > <li>Bug 52036 - Durable Subscription fails with ActiveMQ due to missing > clientId field</li> > +<li>Bug 52044 - JMS Subscriber used with many threads leads to > javax.naming.NamingException: Something already bound with ActiveMQ</li> > </ul> > > <h3>Controllers</h3> > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: notifications-unsubscr...@jakarta.apache.org > For additional commands, e-mail: notifications-h...@jakarta.apache.org > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@jakarta.apache.org For additional commands, e-mail: dev-h...@jakarta.apache.org