You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jmeter-dev@jakarta.apache.org by se...@apache.org on 2008/11/11 23:03:44 UTC

svn commit: r713190 - in /jakarta/jmeter/trunk: src/core/org/apache/jmeter/gui/util/ src/jorphan/org/apache/jorphan/gui/ src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/ src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/ xdocs/

Author: sebb
Date: Tue Nov 11 14:03:43 2008
New Revision: 713190

URL: http://svn.apache.org/viewvc?rev=713190&view=rev
Log:
Major overhaul of JMS classes to:
- improve thread-safety
- make JMX values locale-independent
- improve dynamic locale change handling
Had to move JLabelledRadioI18N to core because it uses JMeterUtils

Added:
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/JLabeledRadioI18N.java   (contents, props changed)
      - copied, changed from r712912, jakarta/jmeter/trunk/src/jorphan/org/apache/jorphan/gui/JLabeledRadioI18N.java
Removed:
    jakarta/jmeter/trunk/src/jorphan/org/apache/jorphan/gui/JLabeledRadioI18N.java
Modified:
    jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSPublisherGui.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/PublisherSampler.java
    jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/SubscriberSampler.java
    jakarta/jmeter/trunk/xdocs/changes.xml

Copied: jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/JLabeledRadioI18N.java (from r712912, jakarta/jmeter/trunk/src/jorphan/org/apache/jorphan/gui/JLabeledRadioI18N.java)
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/JLabeledRadioI18N.java?p2=jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/JLabeledRadioI18N.java&p1=jakarta/jmeter/trunk/src/jorphan/org/apache/jorphan/gui/JLabeledRadioI18N.java&r1=712912&r2=713190&rev=713190&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/jorphan/org/apache/jorphan/gui/JLabeledRadioI18N.java (original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/JLabeledRadioI18N.java Tue Nov 11 14:03:43 2008
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.jorphan.gui;
+package org.apache.jmeter.gui.util;
 
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
@@ -34,6 +34,7 @@
 import javax.swing.event.ChangeListener;
 
 import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.gui.JLabeledField;
 
 /**
  * JLabeledRadio will create a set of Radio buttons with a label.

Propchange: jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/JLabeledRadioI18N.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/JLabeledRadioI18N.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/JLabeledRadioI18N.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Modified: jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSPublisherGui.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSPublisherGui.java?rev=713190&r1=713189&r2=713190&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSPublisherGui.java (original)
+++ jakarta/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSPublisherGui.java Tue Nov 11 14:03:43 2008
@@ -35,7 +35,7 @@
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jmeter.gui.util.FilePanel;
-import org.apache.jorphan.gui.JLabeledRadio;
+import org.apache.jmeter.gui.util.JLabeledRadioI18N;
 import org.apache.jorphan.gui.JLabeledTextField;
 import org.apache.jorphan.gui.JLabeledTextArea;
 import org.apache.jorphan.gui.layout.VerticalLayout;
@@ -51,58 +51,51 @@
 
     private static final String ALL_FILES = "*.*"; //$NON-NLS-1$
 
-    // These must not be static, otherwise Language change does not work
-    public final String use_file = JMeterUtils.getResString("jms_use_file"); //$NON-NLS-1$
+    //++ These names are used in the JMX files, and must not be changed
+    public static final String USE_FILE_RSC   = "jms_use_file"; //$NON-NLS-1$
+    public static final String USE_RANDOM_RSC = "jms_use_random_file"; //$NON-NLS-1$
+    private static final String USE_TEXT_RSC   = "jms_use_text"; //$NON-NLS-1$
 
-    public final String use_random = JMeterUtils.getResString("jms_use_random_file"); //$NON-NLS-1$
+    private static final String TEXT_MSG_RSC = "jms_text_message"; //$NON-NLS-1$
+    private static final String OBJECT_MSG_RSC = "jms_object_message"; //$NON-NLS-1$
+    //--
+    
+    // Button group resources
+    private static final String[] CONFIG_ITEMS = { USE_FILE_RSC, USE_RANDOM_RSC, USE_TEXT_RSC };
 
-    public final String use_text = JMeterUtils.getResString("jms_use_text"); //$NON-NLS-1$
+    private static final String[] MSGTYPES_ITEMS = { TEXT_MSG_RSC, OBJECT_MSG_RSC };
 
-    private String[] items = { use_file, use_random, use_text };
+    private final JCheckBox useProperties = new JCheckBox(JMeterUtils.getResString("jms_use_properties_file"), false); //$NON-NLS-1$
 
-    private String text_msg = JMeterUtils.getResString("jms_text_message"); //$NON-NLS-1$
+    private final JLabeledRadioI18N configChoice = new JLabeledRadioI18N("jms_config", CONFIG_ITEMS, USE_TEXT_RSC); //$NON-NLS-1$
 
-    private String object_msg = JMeterUtils.getResString("jms_object_message"); //$NON-NLS-1$
+    private final JLabeledTextField jndiICF = new JLabeledTextField(JMeterUtils.getResString("jms_initial_context_factory")); //$NON-NLS-1$
 
-    private String[] msgTypes = { text_msg, object_msg };
+    private final JLabeledTextField urlField = new JLabeledTextField(JMeterUtils.getResString("jms_provider_url")); //$NON-NLS-1$
 
-    JCheckBox useProperties = new JCheckBox(JMeterUtils.getResString("jms_use_properties_file"), false); //$NON-NLS-1$
+    private final JLabeledTextField jndiConnFac = new JLabeledTextField(JMeterUtils.getResString("jms_connection_factory")); //$NON-NLS-1$
 
-    JLabeledRadio configChoice = new JLabeledRadio(JMeterUtils.getResString("jms_config"), items, use_text); //$NON-NLS-1$
+    private final JLabeledTextField jmsTopic = new JLabeledTextField(JMeterUtils.getResString("jms_topic")); //$NON-NLS-1$
 
-    JLabeledTextField jndiICF = new JLabeledTextField(JMeterUtils.getResString("jms_initial_context_factory")); //$NON-NLS-1$
+    private final JCheckBox useAuth = new JCheckBox(JMeterUtils.getResString("jms_use_auth"), false); //$NON-NLS-1$
 
-    JLabeledTextField urlField = new JLabeledTextField(JMeterUtils.getResString("jms_provider_url")); //$NON-NLS-1$
+    private final JLabeledTextField jmsUser = new JLabeledTextField(JMeterUtils.getResString("jms_user")); //$NON-NLS-1$
 
-    JLabeledTextField jndiConnFac = new JLabeledTextField(JMeterUtils.getResString("jms_connection_factory")); //$NON-NLS-1$
+    private final JLabeledTextField jmsPwd = new JLabeledTextField(JMeterUtils.getResString("jms_pwd")); //$NON-NLS-1$
 
-    JLabeledTextField jmsTopic = new JLabeledTextField(JMeterUtils.getResString("jms_topic")); //$NON-NLS-1$
+    private final JLabeledTextField iterations = new JLabeledTextField(JMeterUtils.getResString("jms_itertions")); //$NON-NLS-1$
 
-    private JCheckBox useAuth = 
-        new JCheckBox(JMeterUtils.getResString("jms_use_auth"), false); //$NON-NLS-1$
+    private final FilePanel messageFile = new FilePanel(JMeterUtils.getResString("jms_file"), ALL_FILES); //$NON-NLS-1$
 
-    JLabeledTextField jmsUser = new JLabeledTextField(JMeterUtils.getResString("jms_user")); //$NON-NLS-1$
+    private final FilePanel randomFile = new FilePanel(JMeterUtils.getResString("jms_random_file"), ALL_FILES); //$NON-NLS-1$
 
-    JLabeledTextField jmsPwd = new JLabeledTextField(JMeterUtils.getResString("jms_pwd")); //$NON-NLS-1$
+    private final JLabeledTextArea textMessage = new JLabeledTextArea(TEXT_MSG_RSC);
 
-    JLabeledTextField iterations = new JLabeledTextField(JMeterUtils.getResString("jms_itertions")); //$NON-NLS-1$
+    private final JLabeledRadioI18N msgChoice = new JLabeledRadioI18N("jms_message_type", MSGTYPES_ITEMS, TEXT_MSG_RSC); //$NON-NLS-1$
 
-    FilePanel messageFile = new FilePanel(JMeterUtils.getResString("jms_file"), ALL_FILES); //$NON-NLS-1$
+    private final JPanel lookup = new JPanel();
 
-    FilePanel randomFile = new FilePanel(JMeterUtils.getResString("jms_random_file"), ALL_FILES); //$NON-NLS-1$
-
-    JLabeledTextArea textMessage = new JLabeledTextArea(text_msg);
-
-    JLabeledRadio msgChoice = new JLabeledRadio(JMeterUtils.getResString("jms_message_type"), msgTypes, text_msg); //$NON-NLS-1$
-
-    /**
-     * This is the font for the note.
-     */
-    Font plainText = new Font("plain", Font.PLAIN, 10); //$NON-NLS-1$
-
-    private JPanel lookup = null;
-
-    private JPanel messagePanel = null;
+    private final JPanel messagePanel = new JPanel();
 
     public JMSPublisherGui() {
         init();
@@ -186,7 +179,7 @@
         mainPanel.add(getNamePanel());
 
         // Button for browsing webservice wsdl
-        lookup = new JPanel();
+        
         lookup.setLayout(new VerticalLayout(6, VerticalLayout.LEFT));
         mainPanel.add(lookup);
         lookup.add(useProperties);
@@ -207,7 +200,6 @@
         commonParams.add(jmsPwd);
         commonParams.add(iterations);
 
-        messagePanel = new JPanel();
         messagePanel.setLayout(new VerticalLayout(3, VerticalLayout.LEFT));
         messagePanel.add(configChoice);
         messagePanel.add(msgChoice);
@@ -236,8 +228,8 @@
         messageFile.setFilename(""); // $NON-NLS-1$
         randomFile.setFilename(""); // $NON-NLS-1$
         msgChoice.setText(""); // $NON-NLS-1$
-        configChoice.setText(use_text);
-        updateConfig(use_text);
+        configChoice.setText(USE_TEXT_RSC);
+        updateConfig(USE_TEXT_RSC);
         iterations.setText(""); // $NON-NLS-1$
         useAuth.setSelected(false);
     }
@@ -300,12 +292,12 @@
      *
      * @param command
      */
-    public void updateConfig(String command) {
-        if (command.equals(use_text)) {
+    private void updateConfig(String command) {
+        if (command.equals(USE_TEXT_RSC)) {
             textMessage.setEnabled(true);
             messageFile.enableFile(false);
             randomFile.enableFile(false);
-        } else if (command.equals(use_random)) {
+        } else if (command.equals(USE_RANDOM_RSC)) {
             textMessage.setEnabled(false);
             messageFile.enableFile(false);
             randomFile.enableFile(true);
@@ -320,9 +312,9 @@
      *
      * @param msgType
      */
-    public void updateMessageType(String msgType) {
-        if (msgType.equals(object_msg)) {
-            if (configChoice.getText().equals(use_text)) {
+    private void updateMessageType(String msgType) {
+        if (msgType.equals(OBJECT_MSG_RSC)) {
+            if (configChoice.getText().equals(USE_TEXT_RSC)) {
                 JOptionPane.showConfirmDialog(this,
                         JMeterUtils.getResString("jms_error_msg"),  //$NON-NLS-1$
                         "Warning",

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=713190&r1=713189&r2=713190&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 Tue Nov 11 14:03:43 2008
@@ -33,9 +33,9 @@
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.gui.JLabeledTextField;
-import org.apache.jorphan.gui.JLabeledRadio;
 import org.apache.jorphan.gui.layout.VerticalLayout;
 
+import org.apache.jmeter.gui.util.JLabeledRadioI18N;
 import org.apache.jmeter.protocol.jms.sampler.SubscriberSampler;
 
 /**
@@ -44,53 +44,49 @@
  */
 public class JMSSubscriberGui extends AbstractSamplerGui implements java.awt.event.ActionListener, ChangeListener {
 
-    private JCheckBox useProperties =
+    private final JCheckBox useProperties =
         new JCheckBox(JMeterUtils.getResString("jms_use_properties_file"), false); // $NON-NLS-1$
 
-    private JLabeledTextField jndiICF =
+    private final JLabeledTextField jndiICF =
         new JLabeledTextField(JMeterUtils.getResString("jms_initial_context_factory")); // $NON-NLS-1$
 
-    private JLabeledTextField urlField =
+    private final JLabeledTextField urlField =
         new JLabeledTextField(JMeterUtils.getResString("jms_provider_url")); // $NON-NLS-1$
 
-    private JLabeledTextField jndiConnFac =
+    private final JLabeledTextField jndiConnFac =
         new JLabeledTextField(JMeterUtils.getResString("jms_connection_factory")); // $NON-NLS-1$
 
-    private JLabeledTextField jmsTopic =
+    private final JLabeledTextField jmsTopic =
         new JLabeledTextField(JMeterUtils.getResString("jms_topic")); // $NON-NLS-1$
 
-    private JLabeledTextField jmsUser =
+    private final JLabeledTextField jmsUser =
         new JLabeledTextField(JMeterUtils.getResString("jms_user")); // $NON-NLS-1$
 
-    private JLabeledTextField jmsPwd =
+    private final JLabeledTextField jmsPwd =
         new JLabeledTextField(JMeterUtils.getResString("jms_pwd")); // $NON-NLS-1$
 
-    private JLabeledTextField iterations =
+    private final JLabeledTextField iterations =
         new JLabeledTextField(JMeterUtils.getResString("jms_itertions")); // $NON-NLS-1$
 
-    private JCheckBox useAuth = 
+    private final JCheckBox useAuth = 
         new JCheckBox(JMeterUtils.getResString("jms_use_auth"), false); //$NON-NLS-1$
 
-    private JCheckBox readResponse =
+    private final JCheckBox readResponse =
         new JCheckBox(JMeterUtils.getResString("jms_read_response"), true); // $NON-NLS-1$
 
-    // These must not be static, otherwise Language change does not work
-    public final String receive_str = JMeterUtils.getResString("jms_subscriber_receive"); // $NON-NLS-1$
+    //++ Do not change these strings; they are used in JMX files to record the button settings
+    public final static String RECEIVE_RSC = "jms_subscriber_receive"; // $NON-NLS-1$
 
-    public final String onmessage_str = JMeterUtils.getResString("jms_subscriber_on_message"); // $NON-NLS-1$
-
-    private final String[] client_items = { receive_str, onmessage_str };
-
-    private JLabeledRadio clientChoice =
-        new JLabeledRadio(JMeterUtils.getResString("jms_client_type"), client_items, // $NON-NLS-1$
-            receive_str);
-
-    /**
-     * This is the font for the note.
-     */
-    //Font plainText = new Font("plain", Font.PLAIN, 10); // $NON-NLS-1$
-
-    private JPanel lookup = null;
+    public final static String ON_MESSAGE_RSC = "jms_subscriber_on_message"; // $NON-NLS-1$
+    //--
+    
+    // Button group resources
+    private final static String[] CLIENT_ITEMS = { RECEIVE_RSC, ON_MESSAGE_RSC };
+
+    private final JLabeledRadioI18N clientChoice =
+        new JLabeledRadioI18N("jms_client_type", CLIENT_ITEMS, RECEIVE_RSC); // $NON-NLS-1$
+            
+    private final JPanel lookup = new JPanel();
 
     public JMSSubscriberGui() {
         init();
@@ -165,7 +161,7 @@
         mainPanel.add(getNamePanel());
 
         // Button for browsing webservice wsdl
-        lookup = new JPanel();
+
         lookup.setLayout(new VerticalLayout(6, VerticalLayout.LEFT));
         mainPanel.add(lookup);
         lookup.add(useProperties);
@@ -220,7 +216,7 @@
         iterations.setText(""); // $NON-NLS-1$
         useAuth.setSelected(false);
         readResponse.setSelected(true);
-        clientChoice.setText(""); // $NON-NLS-1$
+        clientChoice.setText(RECEIVE_RSC);
     }
 
     /**

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=713190&r1=713189&r2=713190&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 Nov 11 14:03:43 2008
@@ -22,6 +22,7 @@
 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.control.gui.JMSPublisherGui;
@@ -52,12 +53,16 @@
     private static final String MESSAGE_CHOICE = "jms.config_msg_type"; //$NON-NLS-1$
     //--
 
+    // Does not need to be synch. because it is only accessed from the sampler thread
+    // The ClientPool does access it in a different thread, but ClientPool is fully synch.
     private transient Publisher PUB = null;
 
-    private StringBuffer BUFFER = new StringBuffer();
+    // Does not need to be synch. because only used by the sample method as a temporary buffer
+    private final StringBuffer BUFFER = new StringBuffer();
 
     private static final FileServer FSERVER = FileServer.getFileServer();
 
+    // Cache for file. Only used by sample() in a single thread
     private String file_contents = null;
 
     public PublisherSampler() {
@@ -83,19 +88,11 @@
      * @see junit.framework.TestListener#endTest(junit.framework.Test)
      */
     public void testEnded() {
-        log.info("PublisherSampler.testEnded called");
-        Thread.currentThread().interrupt();
-        this.PUB = null;
-        this.BUFFER.setLength(0);
-        this.BUFFER = null;
+        log.debug("PublisherSampler.testEnded called");
         ClientPool.clearClient();
     }
 
-    /**
-     * the implementation creates a new StringBuffer
-     */
     public void testStarted() {
-        this.BUFFER = new StringBuffer();
     }
 
     /**
@@ -108,12 +105,12 @@
      * initialize the Publisher client.
      *
      */
-    public synchronized void initClient() {
+    private void initClient() {
         this.PUB = new Publisher(this.getUseJNDIPropertiesAsBoolean(), this.getJNDIInitialContextFactory(), this
                 .getProviderUrl(), this.getConnectionFactory(), this.getTopic(), this.isUseAuth(), this.getUsername(),
                 this.getPassword());
         ClientPool.addClient(this.PUB);
-        log.info("PublisherSampler.initClient called");
+        log.debug("PublisherSampler.initClient called");
     }
 
     /**
@@ -161,15 +158,15 @@
      *
      * @return the contents for the message
      */
-    public String getMessageContent() {
-        if (this.getConfigChoice().equals(JMSPublisherGui.use_file)) {
+    private String getMessageContent() {
+        if (this.getConfigChoice().equals(JMSPublisherGui.USE_FILE_RSC)) {
             // in the case the test uses a file, we set it locally and
             // prevent loading the file repeatedly
             if (this.file_contents == null) {
                 this.file_contents = this.getFileContent(this.getInputFile());
             }
             return this.file_contents;
-        } else if (this.getConfigChoice().equals(JMSPublisherGui.use_random)) {
+        } else if (this.getConfigChoice().equals(JMSPublisherGui.USE_RANDOM_RSC)) {
             // Maybe we should consider creating a global cache for the
             // random files to make JMeter more efficient.
             String fname = FSERVER.getRandomFile(this.getRandomPath(), new String[] { ".txt", ".obj" })
@@ -202,12 +199,25 @@
         setProperty(CONFIG_CHOICE, choice);
     }
 
+    private static final String USE_FILE_LOCALNAME = JMeterUtils.getResString(JMSPublisherGui.USE_FILE_RSC);
+    private static final String USE_RANDOM_LOCALNAME = JMeterUtils.getResString(JMSPublisherGui.USE_RANDOM_RSC);
+
     /**
      * return the config choice
-     *
+     * Converts from old JMX files which used the local language string
      */
     public String getConfigChoice() {
-        return getPropertyAsString(CONFIG_CHOICE);
+        // Allow for the old JMX file which used the local language string
+        String config = getPropertyAsString(CONFIG_CHOICE);
+        if (config.equals(USE_FILE_LOCALNAME) 
+         || config.equals(JMSPublisherGui.USE_FILE_RSC)){
+            return JMSPublisherGui.USE_FILE_RSC;
+        }
+        if (config.equals(USE_RANDOM_LOCALNAME)
+         || config.equals(JMSPublisherGui.USE_RANDOM_RSC)){
+            return JMSPublisherGui.USE_RANDOM_RSC;
+        }
+        return config; // will be the 3rd option, which is not checked specifically
     }
 
     /**

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=713190&r1=713189&r2=713190&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 Nov 11 14:03:43 2008
@@ -22,9 +22,9 @@
 import javax.jms.MessageListener;
 import javax.jms.TextMessage;
 
-import org.apache.jmeter.samplers.Entry;
 import org.apache.jmeter.samplers.SampleResult;
 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.control.gui.JMSSubscriberGui;
@@ -42,17 +42,18 @@
 
     private static final long serialVersionUID = 233L;
 
-    // private Subscriber SUBSCRIBER = null;
     private static final Logger log = LoggingManager.getLoggerForClass();
 
+    // No need to synch/ - only used by sampler and ClientPool (which does its own synch)
     private transient ReceiveSubscriber SUBSCRIBER = null;
 
-    private StringBuffer BUFFER = new StringBuffer();
+    //@GuardedBy("this")
+    private final StringBuffer BUFFER = new StringBuffer();
 
+    //@GuardedBy("this")
     private transient int counter = 0;
 
-    private volatile boolean isRunning;
-
+    // Don't change the string, as it is used in JMX files
     private static final String CLIENT_CHOICE = "jms.client_choice"; // $NON-NLS-1$
 
     public SubscriberSampler() {
@@ -67,18 +68,12 @@
     }
 
     /**
-     * testEnded is called by Jmeter's engine. the implementation will reset the
-     * count, set RUN to false and clear the StringBuffer.
+     * testEnded is called by Jmeter's engine.
+     * Clears the client pool.
      */
-    public synchronized void testEnded() {
-        log.info("SubscriberSampler.testEnded called");
-        this.isRunning = false;
-        this.resetCount();
+    public void testEnded() {
+        log.debug("SubscriberSampler.testEnded called");
         ClientPool.clearClient();
-        this.BUFFER = null;
-        if (this.SUBSCRIBER != null) {
-            this.SUBSCRIBER = null;
-        }
     }
 
     /*
@@ -107,8 +102,8 @@
             sub.resume();
             ClientPool.addClient(sub);
             ClientPool.put(this, sub);
-            log.info("SubscriberSampler.initListenerClient called");
-            log.info("loop count " + this.getIterations());
+            log.debug("SubscriberSampler.initListenerClient called");
+            log.debug("loop count " + this.getIterations());
         }
         return sub;
     }
@@ -116,22 +111,13 @@
     /**
      * Create the ReceiveSubscriber client for the sampler.
      */
-    public void initReceiveClient() {
+    private void initReceiveClient() {
         this.SUBSCRIBER = new ReceiveSubscriber(this.getUseJNDIPropertiesAsBoolean(), this
                 .getJNDIInitialContextFactory(), this.getProviderUrl(), this.getConnectionFactory(), this.getTopic(),
                 this.isUseAuth(), this.getUsername(), this.getPassword());
         this.SUBSCRIBER.resume();
         ClientPool.addClient(this.SUBSCRIBER);
-        log.info("SubscriberSampler.initReceiveClient called");
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.apache.jmeter.samplers.Sampler#sample(org.apache.jmeter.samplers.Entry)
-     */
-    public SampleResult sample(Entry e) {
-        return this.sample();
+        log.debug("SubscriberSampler.initReceiveClient called");
     }
 
     /**
@@ -141,7 +127,7 @@
      * @return the appropriate sample result
      */
     public SampleResult sample() {
-        if (this.getClientChoice().equals(JMSSubscriberGui.receive_str)) {
+        if (this.getClientChoice().equals(JMSSubscriberGui.RECEIVE_RSC)) {
             return sampleWithReceive();
         } else {
             return sampleWithListener();
@@ -157,21 +143,20 @@
         SampleResult result = new SampleResult();
         result.setSampleLabel(getName());
         initListenerClient();
-        this.isRunning = true;
 
         int loop = this.getIterationCount();
 
         result.sampleStart();
-        while (this.isRunning && this.count(0) < loop) {
+        while (this.count(0) < loop) {
             try {
                 Thread.sleep(0, 50);
-            } catch (Exception e) {
-                log.info(e.getMessage());
+            } catch (InterruptedException e) {
+                log.debug(e.getMessage());
             }
         }
         result.sampleEnd();
         result.setResponseMessage(loop + " samples messages recieved");
-        synchronized (this) {
+        synchronized (this) {// Need to synch because buffer is shared with onMessageHandler
             if (this.getReadResponseAsBoolean()) {
                 result.setResponseData(this.BUFFER.toString().getBytes());
             } else {
@@ -207,8 +192,8 @@
         while (this.SUBSCRIBER.count(0) < loop) {
             try {
                 Thread.sleep(0, 50);
-            } catch (Exception e) {
-                log.info(e.getMessage());
+            } catch (InterruptedException e) {
+                log.debug(e.getMessage());
             }
         }
         result.sampleEnd();
@@ -223,8 +208,7 @@
         result.setSamplerData("Not applicable");
         result.setSampleCount(loop);
 
-        this.SUBSCRIBER.clear();
-        this.SUBSCRIBER.resetCount();
+        this.SUBSCRIBER.reset();
         return result;
     }
 
@@ -279,9 +263,18 @@
     /**
      * Return the client choice.
      *
-     * @return the client choice
+     * @return the client choice, either RECEIVE_RSC or ON_MESSAGE_RSC
      */
     public String getClientChoice() {
-        return getPropertyAsString(CLIENT_CHOICE);
+        String choice = getPropertyAsString(CLIENT_CHOICE);
+        // Convert the old test plan entry (which is the language dependent string) to the resource name
+        if (choice.equals(RECEIVE_STR)){
+            choice = JMSSubscriberGui.RECEIVE_RSC;
+        } else if (!choice.equals(JMSSubscriberGui.RECEIVE_RSC)){
+            choice = JMSSubscriberGui.ON_MESSAGE_RSC;
+        }
+        return choice;
     }
+    // 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=713190&r1=713189&r2=713190&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Tue Nov 11 14:03:43 2008
@@ -106,6 +106,11 @@
 </p>
 
 <p>
+The following deprecated methods were removed from JOrphanUtils: booleanToString(boolean) and valueOf(boolean).
+Java 1.4+ has these methods in the Boolean class.
+</p>
+
+<p>
 The TestElement interface has some new methods:
 <ul>
 <li>void setProperty(String key, String value, String dflt)</li>
@@ -157,6 +162,8 @@
 <li>Bug 34096 - Duplicate samples not eliminated when writing to CSV files</li>
 <li>Bug 44521 - empty variables for a POST in the HTTP Request don't get ignored</li>
 <li>Bug 44941 - Throughput controllers should not share global counters</li>
+<li>Various ReceiveSubscriber thread-safety fixes</li>
+<li>JMSPublisher and Subscriber fixes: thread-safety, support dynamic locale changes, locale independence for JMX attribute values</li>
 </ul>
 
 <h3>Improvements</h3>



---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org