<!DOCTYPE html SYSTEM "about:legacy-compat">
<html lang="en">
<head>
<META http-equiv="Content-Type" content="text/html; charset=iso-8859-15">
<title>Apache JMeter
          -
          User's Manual: Building a JMS (Java Messaging Service) Test Plan</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://fonts.googleapis.com/css?family=Merriweather:400normal" rel="stylesheet" type="text/css">
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="../css/new-style.css">
<link rel="apple-touch-icon-precomposed" href="../images/apple-touch-icon.png">
<link rel="icon" href="../images/favicon.png">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-TileImage" content="../images/mstile-144x144.png">
<meta name="theme-color" content="#ffffff">
</head>
<body role="document">
<a href="#content" class="hidden">Main content</a>
<div class="header">
<!--
            APACHE LOGO
          -->
<div>
<a href="https://www.apache.org"><img title="Apache Software Foundation" class="asf-logo logo" src="../images/asf-logo.svg" alt="Logo ASF"></a>
</div>
<!--
              PROJECT LOGO
            -->
<div>
<a href="https://jmeter.apache.org/"><img class="logo" src="../images/logo.svg" alt="Apache JMeter"></a>
</div>
<div class="banner">
<a href="https://www.apache.org/events/current-event.html"><img src="https://www.apache.org/events/current-event-234x60.png" alt="Current Apache event teaser"></a>
<div class="clear"></div>
</div>
</div>
<div class="nav">
<ul class="menu">
<li onClick="return true">
<div class="menu-title">About</div>
<ul>
<li>
<a href="../index.html">Overview</a>
</li>
<li>
<a href="https://www.apache.org/licenses/">License</a>
</li>
</ul>
</li>
</ul>
<ul class="menu">
<li onClick="return true">
<div class="menu-title">Download</div>
<ul>
<li>
<a href="../download_jmeter.cgi">Download Releases</a>
</li>
<li>
<a href="../changes.html">Release Notes</a>
</li>
</ul>
</li>
</ul>
<ul class="menu">
<li onClick="return true">
<div class="menu-title">Documentation</div>
<ul>
<li>
<a href="../usermanual/get-started.html">Get Started</a>
</li>
<li>
<a href="../usermanual/index.html">User Manual</a>
</li>
<li>
<a href="../usermanual/best-practices.html">Best Practices</a>
</li>
<li>
<a href="../usermanual/component_reference.html">Component Reference</a>
</li>
<li>
<a href="../usermanual/functions.html">Functions Reference</a>
</li>
<li>
<a href="../usermanual/properties_reference.html">Properties Reference</a>
</li>
<li>
<a href="../changes_history.html">Change History</a>
</li>
<li>
<a href="../api/index.html">Javadocs</a>
</li>
<li>
<a href="https://cwiki.apache.org/confluence/display/JMETER/Home">JMeter Wiki</a>
</li>
<li>
<a href="https://cwiki.apache.org/confluence/display/JMETER/JMeterFAQ">FAQ (Wiki)</a>
</li>
</ul>
</li>
</ul>
<ul class="menu">
<li onClick="return true">
<div class="menu-title">Tutorials</div>
<ul>
<li>
<a href="../usermanual/jmeter_distributed_testing_step_by_step.html">Distributed Testing</a>
</li>
<li>
<a href="../usermanual/jmeter_proxy_step_by_step.html">Recording Tests</a>
</li>
<li>
<a href="../usermanual/junitsampler_tutorial.html">JUnit Sampler</a>
</li>
<li>
<a href="../usermanual/jmeter_accesslog_sampler_step_by_step.html">Access Log Sampler</a>
</li>
<li>
<a href="../usermanual/jmeter_tutorial.html">Extending JMeter</a>
</li>
</ul>
</li>
</ul>
<ul class="menu">
<li onClick="return true">
<div class="menu-title">Community</div>
<ul>
<li>
<a href="../issues.html">Issue Tracking</a>
</li>
<li>
<a href="https://www.apache.org/security/">Security</a>
</li>
<li>
<a href="../mail.html">Mailing Lists</a>
</li>
<li>
<a href="../svnindex.html">Source Repositories</a>
</li>
<li>
<a href="../building.html">Building and Contributing</a>
</li>
<li>
<a href="https://projects.apache.org/project.html?jmeter">Project info at Apache</a>
</li>
<li>
<a href="https://cwiki.apache.org/confluence/display/JMETER/JMeterCommitters">Contributors</a>
</li>
</ul>
</li>
</ul>
<ul class="menu">
<li onClick="return true">
<div class="menu-title">Foundation</div>
<ul>
<li>
<a href="https://www.apache.org/">The Apache Software Foundation (ASF)</a>
</li>
<li>
<a href="https://www.apache.org/foundation/getinvolved.html">Get Involved in the ASF</a>
</li>
<li>
<a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
</li>
<li>
<a href="https://www.apache.org/foundation/thanks.html">Thanks</a>
</li>
</ul>
</li>
</ul>
</div>
<div class="main" id="content">
<div class="social-media">
<ul class="social-media-links">
<li class="twitter">
<a href="https://twitter.com/ApacheJMeter" title="Follow us on Twitter"><i class="fa fa-twitter" aria-hidden="true"></i>Twitter</a>
</li>
<li class="github">
<a href="https://github.com/apache/jmeter" title="Fork us on github"><i class="fa fa-github" aria-hidden="true"></i>github</a>
</li>
</ul>
</div>
<ul class="pagelinks">
<li>
<a href="build-jms-point-to-point-test-plan.html">&lt; Prev</a>
</li>
<li>
<a href="../index.html">Index</a>
</li>
<li>
<a href="listeners.html">Next &gt;</a>
</li>
</ul>
<div class="section">
<h1 id="building">11. Building a JMS Topic Test Plan<a class="sectionlink" href="#building" title="Link to here">&para;</a>
</h1>

<div class="clear"></div>
<div class="note">
JMS requires some optional jars to be downloaded. Please refer to <a href="get-started.html">Getting Started</a> for full details.
</div>
<div class="clear"></div>

<p>In this section, you will learn how to create a
<a href="build-test-plan.html">Test Plan</a> to test JMS Providers. You will
create five subscribers and one publisher. You will create 2 thread groups and set
each one to 10 iterations. The total messages is (6 threads) x (1 message) x
(repeat 10 times) = 60 messages. To construct the Test Plan, you will use the
following elements:
<a href="test_plan.html#thread_group">Thread Group</a>,
<a href="../usermanual/component_reference.html#JMS_Publisher">JMS Publisher</a>,
<a href="../usermanual/component_reference.html#JMS_Subscriber">JMS Subscriber</a>, and
<a href="../usermanual/component_reference.html#Graph_Results">Graph Results</a>.</p>


<p>General notes on JMS: There are currently two JMS samplers. One uses JMS topics
and the other uses queues. Topic messages are commonly known as pub/sub messaging.
Topic messaging is generally used in cases where a message is published by a producer and
consumed by multiple subscribers.  Queue messaging is generally used for transactions
where the sender expects a response.  Messaging systems are quite different from
normal HTTP requests. In HTTP, a single user sends a request and gets a response.
Messaging system can work in synchronous and asynchronous mode.  A JMS sampler needs
the JMS implementation jar files; for example, from Apache ActiveMQ.
See <a href="get-started.html#libraries_activemq">here</a> for the list of jars provided by ActiveMQ.</p>


</div>
<div class="section">
<h1 id="adding_users">11.1 Adding Users<a class="sectionlink" href="#adding_users" title="Link to here">&para;</a>
</h1>

<p>The first step is add a <a href="test_plan.html#thread_group">Thread Group</a>
 element.  The Thread Group tells JMeter the number of users you want to simulate,
 how often the users should send requests, and how many requests they should
send.</p>


<p>Go ahead and add the ThreadGroup element by first selecting the Test Plan,
clicking your right mouse button to get the <span class="menuchoice"><span class="guimenuitem">Add</span></span> menu, and then select
<span class="menuchoice"><span class="guimenuitem">Add</span>&nbsp;&rarr;&nbsp;<span class="guimenuitem">ThreadGroup</span></span>.</p>


<p>You should now see the Thread Group element under Test Plan.  If you do not
see the element, then "expand" the Test Plan tree by clicking on the
Test Plan element.</p>


<p>Next, you need to modify the default properties.  Select the Thread Group element
in the tree, if you have not already selected it. You should now see the Thread
Group Control Panel in the right section of the JMeter window (see Figure 11.1
below)</p>


<figure>
<a href="../images/screenshots/webtest/threadgroup.png"><img src="../images/screenshots/webtest/threadgroup.png" width="" height="" alt="
Figure 11.1. Thread Group with Default Values"></a>
<figcaption>
Figure 11.1. Thread Group with Default Values</figcaption>
</figure>


<p>Start by providing a more descriptive name for our Thread Group. In the name
field, enter <span class="code">Subscribers</span>.</p>


<p>Next, increase the number of users (called threads) to <span class="code">5</span>.</p>


<p>In the next field, the Ramp-Up Period, set the value to <span class="code">0</span>
seconds.  This property tells JMeter how long to delay between starting each
user. For example, if you enter a Ramp-Up Period of 5 seconds, JMeter will
finish starting all of your users by the end of the 5 seconds.  So, if we have
5 users and a 5 second Ramp-Up Period, then the delay between starting users
would be 1 second (5 users / 5 seconds = 1 user per second).  If you set the
value to 0, JMeter will immediately start all users.</p>


<p>Clear the checkbox labeled "<span class="code">Forever</span>", and enter a value of <span class="code">10</span> in the Loop
Count field.  This property tells JMeter how many times to repeat your test.
If you enter a loop count value of <span class="code">0</span>, then JMeter will run your test only
once. To have JMeter repeatedly run your Test Plan, select the <span class="code">Forever</span>
checkbox.</p>


<p>Repeat the process and add another thread group. For the second thread
group, enter "<span class="code">Publisher</span>" in the name field, set the number of threads to <span class="code">1</span>,
and set the iteration to <span class="code">10</span>.
</p>


<div class="clear"></div>
<div class="note">In most applications, you have to manually accept
changes you make in a Control Panel.  However, in JMeter, the Control Panel
automatically accepts your changes as you make them.  If you change the
name of an element, the tree will be updated with the new text after you
leave the Control Panel (for example, when selecting another tree element).</div>
<div class="clear"></div>



</div>
<div class="section">
<h1 id="adding_subscriber_publisher">11.2 Adding JMS Subscriber and Publisher<a class="sectionlink" href="#adding_subscriber_publisher" title="Link to here">&para;</a>
</h1>


<p>Make sure the required jar files are in JMeter's <span class="code">lib</span> directory. If they are
not, shutdown JMeter, copy the jar files over and restart JMeter.</p>


<p>Start by adding the sampler <a href="../usermanual/component_reference.html#JMS_Subscriber">JMS Subscriber</a>
to the Subscribers element
(<span class="menuchoice"><span class="guimenuitem">Add</span>&nbsp;&rarr;&nbsp;<span class="guimenuitem">Sampler</span>&nbsp;&rarr;&nbsp;<span class="guimenuitem">JMS Subscriber</span></span>).
Then, select the JMS Subscriber element in the tree and edit the following properties:

<ol>

<li>Change the Name field to "<span class="code">Sample Subscriber</span>"</li>

<li>If the JMS provider uses the <span class="code">jndi.properties</span> file, check the box</li>

<li>Enter the name of the InitialContextFactory class. For example, with ActiveMQ 5.4, the value is "<span class="code">org.apache.activemq.jndi.ActiveMQInitialContextFactory</span>"</li>

<li>Enter the provider URL. This is the URL for the JNDI server, if there is one. For example, with ActiveMQ 5.4 on local machine with default port, the value is "<span class="code">tcp://localhost:61616</span>"</li>

<li>Enter the name of the connection factory. Please refer to the documentation
of the JMS provider for the information. For ActiveMQ, the default is "<span class="code">ConnectionFactory</span>"</li>

<li>Enter the name of the message topic. For ActiveMQ Dynamic Topics (create topics dynamically), example value is "<span class="code">dynamicTopics/MyStaticTopic1</span>"
<div class="clear"></div>
<div class="note">Note: Setup at startup mean that JMeter starting to listen on the Destination at beginning of test without name change possibility.
Setup on Each sample mean that JMeter (re)starting to listen before run each JMS Subscriber sample,
this last option permit to have Destination name with some JMeter variables
</div>
<div class="clear"></div>
</li>

<li>If the JMS provider requires authentication, check "<span class="code">required</span>" and enter the
username and password. For example, Orion JMS requires authentication, while ActiveMQ
and MQSeries does not</li>

<li>Enter <span class="code">10</span> in "<span class="code">Number of samples to aggregate</span>". For performance reasons, the sampler
will aggregate messages, since small messages will arrive very quickly. If the sampler
didn't aggregate the messages, JMeter wouldn't be able to keep up.</li>

<li>If you want to read the response, check the box</li>

<li>There are two client implementations for subscribers. If the JMS provider
exhibits zombie threads with one client, try the other.</li>

</ol>

</p>


<figure>
<a href="../images/screenshots/jms/jms_sub.png"><img src="../images/screenshots/jms/jms_sub.png" width="718" height="526" alt="
Figure 11.2. JMS Subscriber"></a>
<figcaption>
Figure 11.2. JMS Subscriber</figcaption>
</figure>


<p>Next add the sampler <a href="../usermanual/component_reference.html#JMS_Publisher">JMS Publisher</a>
to the Publisher element
(<span class="menuchoice"><span class="guimenuitem">Add</span>&nbsp;&rarr;&nbsp;<span class="guimenuitem">Sampler</span>&nbsp;&rarr;&nbsp;<span class="guimenuitem">JMS Publisher</span></span>).
Then, select the JMS Publisher element in the tree and edit the following properties:
</p>


<ol>

<li>Change the Name field to "<span class="code">Sample Publisher</span>".</li>

<li>If the JMS provider uses the <span class="code">jndi.properties</span> file, check the box</li>

<li>Enter the name of the InitialContextFactory class. For example, with ActiveMQ 5.4, the value is "<span class="code">org.apache.activemq.jndi.ActiveMQInitialContextFactory</span>"</li>

<li>Enter the provider URL. This is the URL for the JNDI server, if there is one. For example, with ActiveMQ 5.4 on local machine with default port, the value is "<span class="code">tcp://localhost:61616</span>"</li>

<li>Enter the name of the connection factory. Please refer to the documentation
of the JMS provider for the information. For ActiveMQ, the default is "<span class="code">ConnectionFactory</span>"</li>

<li>Enter the name of the message topic. For ActiveMQ Dynamic Topics (create topics dynamically), example value is "<span class="code">dynamicTopics/MyStaticTopic1</span>".
<div class="clear"></div>
<div class="note">Note: Setup at startup mean that JMeter starting connection with the Destination at beginning of test without name change possibility.
Setup on Each sample mean that JMeter (re)starting the connection before run each JMS Publisher sample,
this last option permit to have Destination name with some JMeter variables
</div>
<div class="clear"></div>
</li>

<li>If the JMS provider requires authentication, check "<span class="code">required</span>" and enter the
username and password. For example, Orion JMS requires authentication, while ActiveMQ
and MQSeries does not</li>

<li>Enter <span class="code">10</span> in "<span class="code">Number of samples to aggregate</span>". For performance reasons, the sampler
will aggregate messages, since small messages will arrive very quickly. If the sampler
didn't aggregate the messages, JMeter wouldn't be able to keep up.</li>

<li>Select the appropriate configuration for getting the message to publish. If you
want the sampler to randomly select the message, place the messages in a directory
and select the directory using browse.</li>

<li>Select the message type. If the message is in object format or map message, make sure the
message is generated correctly.</li>

</ol>

<p></p>

<figure>
<a href="../images/screenshots/jms/jms_pub.png"><img src="../images/screenshots/jms/jms_pub.png" width="720" height="652" alt="
Figure 11.3. JMS Publisher"></a>
<figcaption>
Figure 11.3. JMS Publisher</figcaption>
</figure>



</div>
<div class="section">
<h1 id="adding_listener">11.3 Adding a Listener to View Store the Test Results<a class="sectionlink" href="#adding_listener" title="Link to here">&para;</a>
</h1>

<p>The final element you need to add to your Test Plan is a
 <a href="component_reference.html#listeners">Listener</a>. This element is
responsible for storing all of the results of your HTTP requests in a file and presenting
a visual model of the data.</p>


<p>Select the Test Plan element and add a <a href="../usermanual/component_reference.html#Graph_Results">Graph Results</a> listener
(<span class="menuchoice"><span class="guimenuitem">Add</span>&nbsp;&rarr;&nbsp;<span class="guimenuitem">Listener</span>&nbsp;&rarr;&nbsp;<span class="guimenuitem">Graph Results</span></span>).  Next, you need to specify a directory and filename of the
output file.  You can either type it into the filename field, or select the
Browse button and browse to a directory and then enter a filename.</p>


<figure>
<a href="../images/screenshots/graph_results.png"><img src="../images/screenshots/graph_results.png" width="915" height="686" alt="
Figure 11.4. Graph Results Listener"></a>
<figcaption>
Figure 11.4. Graph Results Listener</figcaption>
</figure>


</div>
<ul class="pagelinks">
<li>
<a href="build-jms-point-to-point-test-plan.html">&lt; Prev</a>
</li>
<li>
<a href="../index.html">Index</a>
</li>
<li>
<a href="listeners.html">Next &gt;</a>
</li>
</ul>
<div class="share-links">
      Share this page:
      <ul>
<li class="fb">
<a data-social-url="https://facebook.com/sharer/sharer.php?u=" title="Share on facebook"><i class="fa fa-facebook" aria-hidden="true"></i>share</a>
</li>
<li class="twitter">
<a data-social-url="https://twitter.com/intent/tweet?url=" title="Tweet on twitter"><i class="fa fa-twitter" aria-hidden="true"></i>tweet</a>
</li>
</ul>
</div>
<a href="#top" id="topButton">Go to top</a>
</div>
<div class="footer">
<div class="copyright">
            Copyright &copy;
            1999 &ndash;
            2020
            , Apache Software Foundation
          </div>
<div class="trademarks">Apache, Apache JMeter, JMeter, the Apache
            feather, and the Apache JMeter logo are
            trademarks of the
            Apache Software Foundation.
          </div>
</div>
<script>(function(){
            "use strict";
            // enable 'go to top' button functionality
            document.addEventListener('scroll', function() {
                if (document.body.scrollTop > 500 || document.documentElement.scrollTop > 500) {
                    document.getElementById("topButton").style.display = "block";
                } else {
                    document.getElementById("topButton").style.display = "none";
                }
            });
            // fill in the current location into social links on this page.
            var as = document.getElementsByTagName('a');
            var loc = document.location.href;
            if (!loc.toLowerCase().startsWith('http')) {
                return;
            }
            for (var i=0; i<as.length; i++) {
                var href = as[i].getAttribute('data-social-url');
                if (href !== null) {
                    as[i].href = href + encodeURIComponent(loc);
                }
            }
        })();</script>
</body>
</html>
