Author: pmouawad
Date: Sat Oct 15 12:54:04 2011
New Revision: 1183631

URL: http://svn.apache.org/viewvc?rev=1183631&view=rev
Log:
Bug 52036 - Durable Subscription fails with ActiveMQ due to missing clientId 
field

Modified:
    
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/control/gui/JMSSubscriberGui.java
    
jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/SubscriberSampler.java
    jakarta/jmeter/trunk/xdocs/changes.xml
    jakarta/jmeter/trunk/xdocs/images/screenshots/jms/jms_sub.png
    jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml

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=1183631&r1=1183630&r2=1183631&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
 Sat Oct 15 12:54:04 2011
@@ -82,24 +82,12 @@ public class ReceiveSubscriber implement
      */
     public ReceiveSubscriber(boolean useProps, 
             String initialContextFactory, String providerUrl, String 
connfactory, String destinationName,
-            String durableSubscriptionId, boolean useAuth, 
+            String durableSubscriptionId, String clientId, boolean useAuth, 
             String securityPrincipal, String securityCredentials) throws 
NamingException, JMSException {
-        boolean initSuccess = false;
-        try{
-            Context ctx = InitialContextFactory.getContext(useProps, 
-                    initialContextFactory, providerUrl, useAuth, 
securityPrincipal, securityCredentials);
-            CONN = Utils.getConnection(ctx, connfactory);
-            SESSION = CONN.createSession(false, Session.AUTO_ACKNOWLEDGE);
-            Destination dest = Utils.lookupDestination(ctx, destinationName);
-               SUBSCRIBER = createSubscriber(SESSION, dest, 
durableSubscriptionId);
-            queue = null;
-            log.debug("<init> complete");
-            initSuccess = true;
-        } finally {
-            if(!initSuccess) {
-                close();
-            }
-        }
+        this(0, useProps, 
+                initialContextFactory, providerUrl, connfactory, 
destinationName,
+                durableSubscriptionId, clientId, useAuth, 
+                securityPrincipal, securityCredentials, false);
     }
 
     /**
@@ -123,22 +111,60 @@ public class ReceiveSubscriber implement
      */
     public ReceiveSubscriber(int queueSize, boolean useProps, 
             String initialContextFactory, String providerUrl, String 
connfactory, String destinationName,
-            String durableSubscriptionId, boolean useAuth, 
+            String durableSubscriptionId, String clientId, boolean useAuth, 
             String securityPrincipal, String securityCredentials) throws 
NamingException, JMSException {
+        this(queueSize,  useProps, 
+             initialContextFactory, providerUrl, connfactory, destinationName,
+             durableSubscriptionId, clientId, useAuth, 
+             securityPrincipal,  securityCredentials, true);
+    }
+    
+    
+    /**
+     * Constructor takes the necessary JNDI related parameters to create a
+     * connection and create an onMessageListener to prepare to begin 
receiving messages.
+     * <br/>
+     * The caller must then invoke {@link #start()} to enable message 
reception.
+     * 
+     * @param queueSize maximum queue size <=0 == no limit
+     * @param useProps if true, use jndi.properties instead of 
+     * initialContextFactory, providerUrl, securityPrincipal, 
securityCredentials
+     * @param initialContextFactory
+     * @param providerUrl
+     * @param connfactory
+     * @param destinationName
+     * @param useAuth
+     * @param securityPrincipal
+     * @param securityCredentials
+     * @param useMessageListener if true create an onMessageListener to 
prepare to begin receiving messages, otherwise queue will be null
+     * @throws JMSException if could not create context or other problem 
occurred.
+     * @throws NamingException 
+     */
+    private ReceiveSubscriber(int queueSize, boolean useProps, 
+            String initialContextFactory, String providerUrl, String 
connfactory, String destinationName,
+            String durableSubscriptionId, String clientId, boolean useAuth, 
+            String securityPrincipal, String securityCredentials, boolean 
useMessageListener) throws NamingException, JMSException {
         boolean initSuccess = false;
         try{
             Context ctx = InitialContextFactory.getContext(useProps, 
                     initialContextFactory, providerUrl, useAuth, 
securityPrincipal, securityCredentials);
             CONN = Utils.getConnection(ctx, connfactory);
+            if(!isEmpty(clientId)) {
+                CONN.setClientID(clientId);
+            }
             SESSION = CONN.createSession(false, Session.AUTO_ACKNOWLEDGE);
             Destination dest = Utils.lookupDestination(ctx, destinationName);
             SUBSCRIBER = createSubscriber(SESSION, dest, 
durableSubscriptionId);
-            if (queueSize <=0) {
-                queue = new LinkedBlockingQueue<Message>();
+            if(useMessageListener) {
+                if (queueSize <=0) {
+                    queue = new LinkedBlockingQueue<Message>();
+                } else {
+                    queue = new LinkedBlockingQueue<Message>(queueSize);       
     
+                }
+                SUBSCRIBER.setMessageListener(this);
             } else {
-                queue = new LinkedBlockingQueue<Message>(queueSize);           
 
+                queue = null;
             }
-            SUBSCRIBER.setMessageListener(this);
             log.debug("<init> complete");
             initSuccess = true;
         }

Modified: 
jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSSubscriberGui.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSSubscriberGui.java?rev=1183631&r1=1183630&r2=1183631&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSSubscriberGui.java
 (original)
+++ 
jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSSubscriberGui.java
 Sat Oct 15 12:54:04 2011
@@ -62,6 +62,9 @@ public class JMSSubscriberGui extends Ab
     private final JLabeledTextField jmsDurableSubscriptionId =
         new 
JLabeledTextField(JMeterUtils.getResString("jms_durable_subscription_id")); // 
$NON-NLS-1$
 
+    private final JLabeledTextField jmsClientId =
+        new JLabeledTextField(JMeterUtils.getResString("jms_client_id")); // 
$NON-NLS-1$
+
     private final JLabeledTextField jmsUser =
         new JLabeledTextField(JMeterUtils.getResString("jms_user")); // 
$NON-NLS-1$
 
@@ -136,6 +139,7 @@ public class JMSSubscriberGui extends Ab
         sampler.setConnectionFactory(jndiConnFac.getText());
         sampler.setDestination(jmsDestination.getText());
         sampler.setDurableSubscriptionId(jmsDurableSubscriptionId.getText());
+        sampler.setClientID(jmsClientId.getText());
         sampler.setUsername(jmsUser.getText());
         sampler.setPassword(jmsPwd.getText());
         sampler.setUseAuth(useAuth.isSelected());
@@ -169,6 +173,7 @@ public class JMSSubscriberGui extends Ab
         mainPanel.add(jndiConnFac);
         mainPanel.add(createDestinationPane());
         mainPanel.add(jmsDurableSubscriptionId);
+        mainPanel.add(jmsClientId);
         mainPanel.add(useAuth);
         mainPanel.add(jmsUser);
         mainPanel.add(jmsPwd);
@@ -199,6 +204,7 @@ public class JMSSubscriberGui extends Ab
         jndiConnFac.setText(sampler.getConnectionFactory());
         jmsDestination.setText(sampler.getDestination());
         jmsDurableSubscriptionId.setText(sampler.getDurableSubscriptionId());
+        jmsClientId.setText(sampler.getClientId());
         jmsUser.setText(sampler.getUsername());
         jmsPwd.setText(sampler.getPassword());
         iterations.setText(sampler.getIterations());
@@ -221,6 +227,7 @@ public class JMSSubscriberGui extends Ab
         jndiConnFac.setText(""); // $NON-NLS-1$
         jmsDestination.setText(""); // $NON-NLS-1$
         jmsDurableSubscriptionId.setText(""); // $NON-NLS-1$
+        jmsClientId.setText(""); // $NON-NLS-1$
         jmsUser.setText(""); // $NON-NLS-1$
         jmsPwd.setText(""); // $NON-NLS-1$
         iterations.setText("1"); // $NON-NLS-1$

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=1183631&r1=1183630&r2=1183631&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
 Sat Oct 15 12:54:04 2011
@@ -81,7 +81,9 @@ public class SubscriberSampler extends B
     private static final String TIMEOUT = "jms.timeout"; // $NON-NLS-1$
     private static final String TIMEOUT_DEFAULT = "";
     private static final String DURABLE_SUBSCRIPTION_ID = 
"jms.durableSubscriptionId"; // $NON-NLS-1$
+    private static final String CLIENT_ID = "jms.clientId"; // $NON-NLS-1$
     private static final String DURABLE_SUBSCRIPTION_ID_DEFAULT = "";
+    private static final String CLIENT_ID_DEFAULT = ""; // $NON-NLS-1$
     private static final String STOP_BETWEEN = "jms.stop_between_samples"; // 
$NON-NLS-1$
     
     private transient boolean START_ON_SAMPLE = false;
@@ -99,7 +101,7 @@ public class SubscriberSampler extends B
     private void initListenerClient() throws JMSException, NamingException {
         SUBSCRIBER = new ReceiveSubscriber(0, getUseJNDIPropertiesAsBoolean(), 
getJNDIInitialContextFactory(),
                     getProviderUrl(), getConnectionFactory(), 
getDestination(), getDurableSubscriptionId(),
-                    isUseAuth(), getUsername(), getPassword());
+                    getClientId(), isUseAuth(), getUsername(), getPassword());
         log.debug("SubscriberSampler.initListenerClient called");
     }
 
@@ -111,7 +113,7 @@ public class SubscriberSampler extends B
     private void initReceiveClient() throws NamingException, JMSException {
         SUBSCRIBER = new ReceiveSubscriber(getUseJNDIPropertiesAsBoolean(),
                 getJNDIInitialContextFactory(), getProviderUrl(), 
getConnectionFactory(), getDestination(),
-                getDurableSubscriptionId(), isUseAuth(), getUsername(), 
getPassword());
+                getDurableSubscriptionId(), getClientId(), isUseAuth(), 
getUsername(), getPassword());
         log.debug("SubscriberSampler.initReceiveClient called");
     }
 
@@ -362,11 +364,25 @@ public class SubscriberSampler extends B
     public String getDurableSubscriptionId(){
         return getPropertyAsString(DURABLE_SUBSCRIPTION_ID);
     }
+    
+    /**
+     * @return JMS Client ID
+     */
+    public String getClientId() {
+        return getPropertyAsString(CLIENT_ID);
+    }
 
     public void setDurableSubscriptionId(String durableSubscriptionId){
         setProperty(DURABLE_SUBSCRIPTION_ID, durableSubscriptionId, 
DURABLE_SUBSCRIPTION_ID_DEFAULT);        
     }
 
+    /**
+     * @param clientId JMS CLient id
+     */
+    public void setClientID(String clientId) {
+        setProperty(CLIENT_ID, clientId, CLIENT_ID_DEFAULT);
+    }
+    
     // This was the old value that was checked for
     private final static String RECEIVE_STR = 
JMeterUtils.getResString(JMSSubscriberGui.RECEIVE_RSC); // $NON-NLS-1$
 

Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=1183631&r1=1183630&r2=1183631&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Sat Oct 15 12:54:04 2011
@@ -96,6 +96,7 @@ Mirror server now uses default port 8081
 <ul>
 <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>
 </ul>
 
 <h3>Controllers</h3>

Modified: jakarta/jmeter/trunk/xdocs/images/screenshots/jms/jms_sub.png
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/images/screenshots/jms/jms_sub.png?rev=1183631&r1=1183630&r2=1183631&view=diff
==============================================================================
Binary files - no diff available.

Modified: jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml?rev=1183631&r1=1183630&r2=1183631&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml (original)
+++ jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml Sat Oct 15 
12:54:04 2011
@@ -1307,6 +1307,8 @@ The following table shows some values wh
   <property name="Destination" required="Yes">the message destination (topic 
or queue name)</property>
   <property name="Durable Subscription ID" required="No">The ID to use for a 
durable subscription. On first 
   use the respective queue will automatically be generated by the JMS provider 
if it does not exist yet.</property>
+  <property name="Client ID" required="No">The Client ID to use when you you 
use a durable subscription. 
+  Be sure to add a variable like ${__threadNum} when you have more than one 
Thread.</property>
   <property name="Setup" required="Yes">The destination setup type. With At 
startup, the destination name is static (i.e. always same name during the 
test), with Each sample, the destination name is dynamic and is evaluate at 
each sample (i.e. the destination name may be a variable)</property>
   <property name="Authentication" required="Yes">Authentication requirement 
for the JMS provider</property>
   <property name="User" required="No">User Name</property>



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to