{"id":1860,"date":"2012-09-07T01:00:00","date_gmt":"2012-09-07T01:00:00","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/2012\/10\/benchmarking-jms-layer-with-jmstester.html"},"modified":"2012-10-22T06:59:28","modified_gmt":"2012-10-22T06:59:28","slug":"benchmarking-jms-layer-with-jmstester","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html","title":{"rendered":"Benchmarking JMS layer with JMSTester"},"content":{"rendered":"<div dir=\"ltr\" style=\"text-align: left\">For most of the clients I\u2019ve been to, scaling out a JMS messaging layer with ActiveMQ is a priority. There are a couple ways to achieve this, but without a doubt, creating benchmarks and analyzing an architecture on real hardware (or as my colleague <a href=\"http:\/\/blog.garytully.com\/\">Gary Tully<\/a> says \u201casking the machine\u201d) is step one. But what opensource options do you have for creating a set of comprehensive benchmarks? <\/p>\n<p>If you have experience with some good ones, please let me know in the comments. The projects that I could think of:<\/p>\n<ul>\n<li><a href=\"http:\/\/jmeter.apache.org\/\">Apache Jmeter<\/a><\/li>\n<li><a href=\"http:\/\/activemq.apache.org\/activemq-performance-module-users-manual.html\">ActiveMQ perf plugin<\/a><\/li>\n<li><a href=\"http:\/\/jmstester.fusesource.org\/\">FuseSource JMSTester<\/a><\/li>\n<li>Hiram Chirino\u2019s <a href=\"https:\/\/github.com\/chirino\/jms-benchmark\">jms-benchmark<\/a><\/li>\n<\/ul>\n<p>While chatting with Gary about setting up test scenarios for ActiveMQ, he recalled there was a very interesting project that appeared dead sitting in the <a href=\"http:\/\/www.fusesource.com\/forge\">FuseSource Forge<\/a> repo named <a href=\"http:\/\/jmstester.fusesource.org\/\">JMSTester<\/a>. He suggested I take a look at it. I did, and I was impressed at its current capabilities. It was created by a former <a href=\"http:\/\/www.fusesource.com\/\">FuseSource<\/a> consultant, <a href=\"http:\/\/de.linkedin.com\/pub\/andreas-gies\/0\/594\/aa5\">Andres Gies<\/a>, through many iterations with clients, flights, and free-time hacking. I have since taken it over and I will be adding features, tests, docs, and continuing the momentum it once had.         <\/p>\n<p>But even before I can get my creative hands in there, I want to share with you the power it has at the moment.<br \/>\n<strong><br \/>\n<\/strong><strong>Purpose<\/strong>        <\/p>\n<p>The purpose of this blog entry is to give a tutorial-like introduction to the JMSTester tool. The purpose of the tool is to provide a powerful benchmarking framework to create flexible, distributed JMS tests while monitoring\/recording stats critical to have on-hand before making tweaks and tuning your JMS layer.         <\/p>\n<p>Some of the docs from the JMSTester homepage are slightly out of date, but the steps that describe some of the benchmarks are still accurate. This tutorial will require you download the SNAPSHOT I\u2019ve been working on, which can be found here: <a href=\"http:\/\/www.christianposta.com\/blog\/jmstester-1.1-20120904.213157-5-bin.tar.gz\">jmstester-1.1-20120904.213157-5-bin.tar.gz<\/a>. I will be deploying the next version of the website soon, which should have more updated versions of the binaries. When I do that, I\u2019ll update this post.<br \/>\n<strong><br \/>\n<\/strong><strong>Meet the JMSTester tool<\/strong>        <\/p>\n<p>The JMSTester tool is simply a tool that sends and receives JMS messages. You use profiles defined in spring context config files to specify what sort of load you want to throw at your message broker. JMSTester allows you to define the number of producers you wish to use, the number of consumers, the connection factories, JMS properties (transactions, session acks,), etc. But the really cool part is you can run the benchmarks distributed over many machines. This means you setup machines to specifically act as producers and different ones to act as consumers. As far as monitoring and collecting the stats for benchmarking, JMSTester captures information in three different categories:         <\/p>\n<ol>\n<li>Basic: message counts per consumer, message size<\/li>\n<li>JMX: monitor any JMX properties on the broker as the tests run, including number of threads, queue size, enqueue time, etc<\/li>\n<li>Machine: CPU, system memory, swap, file system metrics, network interface, route\/connection tables, etc<\/li>\n<\/ol>\n<p>They Hyperic SIGAR library is used to capture the machine-level stats (group 3) and the RRD4J library is used to log the stats and output graphs. At the moment, I believe the graphs are pretty basic and I hope to improve upon those, but the raw data is always dumped to a csv file and you can use your favorite spreadsheet software to create your own graphs.<br \/>\n<strong><br \/>\n<\/strong><strong>Architecture<\/strong>        <\/p>\n<p>The JMSTester tool is made up the following concepts:         <\/p>\n<ul>\n<li>Controller<\/li>\n<li>Clients<\/li>\n<li>Recorder<\/li>\n<li>Frontend<\/li>\n<li>Benchmark Configuration<\/li>\n<\/ul>\n<div>\n<\/div>\n<p><strong>Controller<\/strong>        <\/p>\n<p>The controller is the organizer for the benchmark. It keeps track of who\u2019s interested in benchmark commands, starts the tests, keeps track of the number of consumers, the number of producers, etc. The benchmark cannot run without a controller. For those of you interested, the underlying architecture of the JMSTester tool relies on messaging, and ActiveMQ is the broker that the controller starts up for the rest of the architecture to work.<br \/>\n<strong><br \/>\n<\/strong><strong>Clients<\/strong>        <div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>Clients are containers that take commands and can emulate the role of <em>Producer<\/em>, <em>Consumer<\/em> or both or neither (this will make sense further down). You can have as many clients as you want. You give them unique names and use their names within your benchmark configuration files. The clients can run anywhere, including on separate machines or all on one machine.<br \/>\n<strong><br \/>\n<\/strong><strong>Recorder<\/strong>        <\/p>\n<p>The clients individually record stats and send the data over to the recorder. The recorder ends up organizing the stats and assembling the graphs, RRD4J databases, and benchmark csv files.<br \/>\n<strong><br \/>\n<\/strong><strong>Frontend<\/strong>        <\/p>\n<p>The frontend is what sends commands to the controller. Right now there is only a command-line front end, but my intentions include a web-based front end with a REST-based controller that can be used to run the benchmarks.<br \/>\n<strong><br \/>\n<\/strong><strong>Benchmark Configuration<\/strong>        <\/p>\n<p>The configuration files are <a href=\"http:\/\/www.springsource.org\/\">Spring<\/a> context files that specify beans that instruct the controller and clients how to run the benchmark. In these config files, you can also specify what metrics to capture and while kind of message load to send to the JMS broker. Going forward I aim to improve these config files including adding custom namespace support to make the config less verbose.<br \/>\n<strong><br \/>\n<\/strong><strong>Let\u2019s Go!<\/strong>        <\/p>\n<p>The <a href=\"http:\/\/jmstester.fusesource.org\/\">JMSTester<\/a> website has a couple of good introductory tutorials:         <\/p>\n<ul>\n<li>Simple: http:\/\/jmstester.fusesource.org\/documentation\/manual\/TutorialSimple.html<\/li>\n<li>JMX Probes: http:\/\/jmstester.fusesource.org\/documentation\/manual\/TutorialProbes.html<\/li>\n<li>Distributed: http:\/\/jmstester.fusesource.org\/documentation\/manual\/TutorialDistributed.html<\/li>\n<\/ul>\n<p>They are mostly up-to-date, but I\u2019ll continue to update them as I find errors.         <\/p>\n<p>The only thing about the <em>distributed<\/em> tutorial, it doesn\u2019t actually set up a distributed example. It separates out the clients but only on the same localhost machine. There are just a couple other parameters that need to be set to distribute it, which we\u2019ll cover here.         <\/p>\n<p>The architecture for the tutorial will be the following:         <\/p>\n<div class=\"separator\" style=\"clear: both;text-align: center\"><a href=\"http:\/\/4.bp.blogspot.com\/-H3cU7EvaTd8\/UEjkmyvwBVI\/AAAAAAAAB3Q\/y0G53tGH3bc\/s1600\/jmstester-blog-diagram.png\"><img decoding=\"async\" border=\"0\" height=\"255\" src=\"http:\/\/4.bp.blogspot.com\/-H3cU7EvaTd8\/UEjkmyvwBVI\/AAAAAAAAB3Q\/y0G53tGH3bc\/s320\/jmstester-blog-diagram.png\" width=\"320\" \/><\/a><\/div>\n<p>Let\u2019s understand the diagram really quickly.         <\/p>\n<p>The <em>JMS Host<\/em> will have two processes running: the ActiveMQ broker we\u2019ll be testing, and a JMSTester client container named <strong>Monitor<\/strong>. The container will be neither a producer or container, but instead will be used only to monitor machine and JMX statistics. The statistics will be sent back to the recorder on the <em>Controller Host<\/em> as described in the Recorder section above. The <em>Producer<\/em> and <em>Consumer<\/em> containers will be run on separate machines named, respectively, <strong>Producer<\/strong> and <strong>Consumer<\/strong>. Lastly, the <em>Controller Host<\/em> machine will have the <em>Controller<\/em> and <em>Recorder<\/em> components of the distributed test.<br \/>\n<strong><br \/>\n<\/strong><strong>Initial Setup<\/strong>        <\/p>\n<p>Download and extract the JMSTester binaries <em>on each machine that will be participating in the benchmark<\/em>.<br \/>\n<strong><br \/>\n<\/strong><strong>Starting the Controller and Recorder containers<\/strong>        <\/p>\n<p>On the machine that will host the controller, navigate to the $JMSTESTER_HOME dir and type the following command to start the controller and the recorder:<\/p>\n<pre class=\"brush:bash\">.\/bin\/runBenchmark -controller -recorder -springConfigLocations conf\/testScripts\r\n<\/pre>\n<p>Note that everything must be typed exactly as it is above, including no trailing spaces on the \u2018conf\/testScripts\u2019<br \/>\nThis is a particularity that I will alleviate as part of my future enhancements.         <\/p>\n<p>Once you\u2019ve started the controller and recorder, you should be ready to start up the rest of the clients. The controller starts up an embedded broker that the clients will end up connecting to.<br \/>\n<strong><br \/>\n<\/strong><strong>Starting the Producer container<\/strong>        <\/p>\n<p>On the machine that will host the producer, navigate to the $JMSTESTER_HOME dir, and type the following command: <\/p>\n<pre class=\"brush:bash\">.\/bin\/runBenchmark -clientNames Producer -hostname domU-12-31-39-16-41-05.compute-1.internal\r\n<\/pre>\n<p>For the <strong>-hostname<\/strong> parameter, you must specify the host name where you started the controller. I\u2019m using <a href=\"http:\/\/aws.amazon.com\/ec2\/\">Amazon EC2<\/a> above, and if you\u2019re doing the same, prefer to use the internal DNS name for the hosts.<\/p>\n<p><strong>Starting the Consumer container<\/strong>        <\/p>\n<p>For the consumer container, you\u2019ll be doing the same thing you did for the producer, except give it a client name of <em>Consumer<\/em><\/p>\n<pre class=\"brush:bash\">.\/bin\/runBenchmark -clientNames Consumer -hostname domU-12-31-39-16-41-05.compute-1.internal<\/pre>\n<p>Again, the <strong>-hostname<\/strong> parameter should reflect the host on which you\u2019re running the controller.<br \/>\n<strong><br \/>\n<\/strong><strong>Setting up ActiveMQ and the Monitor on JMS Host<\/strong>        <\/p>\n<p>Setting up ActiveMQ is beyond the scope of this article.<br \/>\nBut you will need to enable JMX on the broker. Just <a href=\"http:\/\/activemq.apache.org\/jmx.html\">follow the instructions<\/a> found on the Apache ActiveMQ website.         <\/p>\n<p>This next part is necessary to allow the machine-level probe\/monitoring. You\u2019ll need to install the SIGAR libs. They are not distributed with JMSTester because of their license, and their JNI libs are not available in Maven. Basically all you need to do is download and extract the [SIGAR distro from here][sigar-distro] and copy all of the libs from the <code>$SIGAR_HOME\/sigar-bin\/lib<\/code> folder into your $JMSTESTER_HOME\/lib folder.         <\/p>\n<p>Now start the Monitor container with a similar command for the producer and consumer:&lt; <\/p>\n<pre class=\"brush:bash\">.\/bin\/runBenchmark -clientNames Monitor -hostname domU-12-31-39-16-41-05.compute-1.internal<\/pre>\n<p><strong>Submitting the tutorial testcase<\/strong>        <\/p>\n<p>We can submit the testcase from any computer. I\u2019ve chosen to do it from my local machine. You\u2019ll notice the machine from which you submit the testcase isn\u2019t reflected in the diagram from above; this is simply because we can do it from any machine. Just like the other commands, however, you\u2019ll still need the JMSTester binaries.         <\/p>\n<p>Before we run the test, let\u2019s take a quick look at the Spring config file that specifies the test. To do so, open up $JMSTESTER_HOME\/conf\/testScripts\/tutorial\/benchmark.xml in your favorite text editor, preferably one that color-codes XML documents so it\u2019s easier to read. The benchmark file is annotated with a lot of comments that describe the individual sections clearly. If something is not clear, please ping me so I can provide more details.         <\/p>\n<p>There are a couple places in the config where you\u2019ll want to specify your own values to make this a successful test. Unfortunately, this is a manual process at the moment, but I plan to fix that up.         <\/p>\n<p>Take a look at where the JMS broker connection factories are created. In this case, that would be where the ActiveMQ Connection Factories are created (lines 120 and 124.) The URL that goes here is the URL for the ActiveMQ broker you started in one of the previous sections. As it\u2019s distributed, there is a EC2 host url in there. You must specify your own host. Again, if you use EC2, prefer the internal DNS names.         <\/p>\n<p>Then, take a look at line 169 where the AMQDestinationProbe is specified. This probe is JMX-probe specific to ActiveMQ. You must change the <code>brokerName<\/code> property to match whatever you named your broker when you started it (usually found in the <code>&lt;broker brokerName='name here'&gt;<\/code> section of your broker config).         <\/p>\n<p>Finally, from the $JMSTESTER_HOME dir, run the following command:<\/p>\n<pre class=\"brush:bash\">.\/bin\/runCommand -command submit:conf\/testScripts\/tutorial -hostname ec2-107-21-69-197.compute-1.amazonaws.com<\/pre>\n<p>Again, note that I\u2019m setting the <strong>-hostname<\/strong> parameter to the host that the controller is running on. In this case, we\u2019ll prefer the public DNS of EC2, but it would be whatever you have in your environment.<br \/>\n<strong><br \/>\n<\/strong><strong>Output<\/strong>        <\/p>\n<p>There you have it. You\u2019ve submitted the testcase to the benchmark frammework. You should see some activity on each on of the clients (producer, consumer, monitor) as well as on the controller. If your test has run correctly and all of the raw data and graphs have been produced, you should see something similar as logging output:<\/p>\n<pre class=\"brush:bash\">Written probe Values to : \/home\/ec2-user\/dev\/jmstester-1.1-SNAPSHOT\/tutorialBenchmark\/benchmark.csv<\/pre>\n<p>Note that all of the results are written to <em>tutorialBenchmark<\/em> which is the name of the test as defined by the <strong>benchmarkId<\/strong> in the Spring config file on line 18:<\/p>\n<pre class=\"brush:bash\">&lt;property name='benchmarkId' value='tutorialBenchmark'\/&gt;<\/pre>\n<p>If you take a look at the <code>benchmark.csv<\/code> file, you\u2019ll see all of the stats that were collected. The stats for this tutorial that were collected include the following:         <\/p>\n<ul>\n<li>message count<\/li>\n<li>message size<\/li>\n<li>JMX QueueSize<\/li>\n<li>JMX ThreadCount<\/li>\n<li>SIGAR CpuMonitor<\/li>\n<li>SIGAR Free System Memory<\/li>\n<li>SIGAR Total System Memory<\/li>\n<li>SIGAR Free Swap <\/li>\n<li>SIGAR Total Swap<\/li>\n<li>SIGAR Swap Page In<\/li>\n<li>SIGAR Swap Page Out<\/li>\n<li>SIGAR Disk Reads (in bytes)<\/li>\n<li>SIGAR Disk Write (in bytes)<\/li>\n<li>SIGAR Disk Reads<\/li>\n<li>SGIAR Disk Writes<\/li>\n<li>SIGAR Network RX BYTES<\/li>\n<li>SIGAR Network RX PACKETS<\/li>\n<li>SIGAR Network TX BYTES<\/li>\n<li>SIGAR Network RX DROPPED<\/li>\n<li>SiGAR Network TX DROPPED<\/li>\n<li>SIGAR Network RX ERRORS<\/li>\n<li>SIGAR Network TX ERRORS<\/li>\n<\/ul>\n<div>\n<\/div>\n<p><strong>That\u2019s it<\/strong>        <\/p>\n<p>I highly recommend taking a look at this project. I haven taken it over, and will be improving it as time permits, but I would very much value any thoughts or suggestions about how to improve it or what use cases to support. Take a look at the documentation already there, and I will be adding more as we go.<br \/>\nIf you have questions, or something didn\u2019t work properly as described above, please shoot me a comment, email or find me in the Apache IRC channels\u2026 I\u2019m usually in at least #activemq and #camel.<\/p>\n<p>Happy coding and don&#8217;t forget to share!<\/p>\n<p><strong><i>Reference: <\/i><\/strong><a href=\"http:\/\/www.christianposta.com\/blog\/?p=268\">Benchmarking your JMS layer with an open source JMSTester tool from FuseSource<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/p\/jcg.html\">JCG partner<\/a> Christian Posta at the <a href=\"http:\/\/www.christianposta.com\/blog\/\">Christian Posta Software<\/a> blog.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>For most of the clients I\u2019ve been to, scaling out a JMS messaging layer with ActiveMQ is a priority. There are a couple ways to achieve this, but without a doubt, creating benchmarks and analyzing an architecture on real hardware (or as my colleague Gary Tully says \u201casking the machine\u201d) is step one. But what &hellip;<\/p>\n","protected":false},"author":204,"featured_media":112,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[59],"class_list":["post-1860","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-jms"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Benchmarking JMS layer with JMSTester - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"For most of the clients I\u2019ve been to, scaling out a JMS messaging layer with ActiveMQ is a priority. There are a couple ways to achieve this, but without\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Benchmarking JMS layer with JMSTester - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"For most of the clients I\u2019ve been to, scaling out a JMS messaging layer with ActiveMQ is a priority. There are a couple ways to achieve this, but without\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2012-09-07T01:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-10-22T06:59:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Christian Posta\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/christianposta\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Christian Posta\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/benchmarking-jms-layer-with-jmstester.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/benchmarking-jms-layer-with-jmstester.html\"},\"author\":{\"name\":\"Christian Posta\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/95b83ea6815f602e6feade679134c6ed\"},\"headline\":\"Benchmarking JMS layer with JMSTester\",\"datePublished\":\"2012-09-07T01:00:00+00:00\",\"dateModified\":\"2012-10-22T06:59:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/benchmarking-jms-layer-with-jmstester.html\"},\"wordCount\":2096,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/benchmarking-jms-layer-with-jmstester.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"keywords\":[\"JMS\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/benchmarking-jms-layer-with-jmstester.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/benchmarking-jms-layer-with-jmstester.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/benchmarking-jms-layer-with-jmstester.html\",\"name\":\"Benchmarking JMS layer with JMSTester - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/benchmarking-jms-layer-with-jmstester.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/benchmarking-jms-layer-with-jmstester.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"datePublished\":\"2012-09-07T01:00:00+00:00\",\"dateModified\":\"2012-10-22T06:59:28+00:00\",\"description\":\"For most of the clients I\u2019ve been to, scaling out a JMS messaging layer with ActiveMQ is a priority. There are a couple ways to achieve this, but without\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/benchmarking-jms-layer-with-jmstester.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/benchmarking-jms-layer-with-jmstester.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/benchmarking-jms-layer-with-jmstester.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"java-interview-questions-answers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/benchmarking-jms-layer-with-jmstester.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Benchmarking JMS layer with JMSTester\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/95b83ea6815f602e6feade679134c6ed\",\"name\":\"Christian Posta\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g\",\"caption\":\"Christian Posta\"},\"description\":\"Christian is a Principal Consultant at FuseSource specializing in developing enterprise software applications with an emphasis on software integration and messaging. His strengths include helping clients build software using industry best practices, Test Driven Design, ActiveMQ, Apache Camel, ServiceMix, Spring Framework, and most importantly, modeling complex domains so that they can be realized in software. He works primarily using Java and its many frameworks, but his favorite programming language is Python. He's in the midst of learning Scala and hopes to contribute to the Apache Apollo project.\",\"sameAs\":[\"http:\\\/\\\/www.christianposta.com\\\/blog\\\/\",\"http:\\\/\\\/www.linkedin.com\\\/pub\\\/christian-posta\\\/15\\\/412\\\/199\",\"https:\\\/\\\/x.com\\\/http:\\\/\\\/twitter.com\\\/christianposta\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Christian-Posta\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Benchmarking JMS layer with JMSTester - Java Code Geeks","description":"For most of the clients I\u2019ve been to, scaling out a JMS messaging layer with ActiveMQ is a priority. There are a couple ways to achieve this, but without","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html","og_locale":"en_US","og_type":"article","og_title":"Benchmarking JMS layer with JMSTester - Java Code Geeks","og_description":"For most of the clients I\u2019ve been to, scaling out a JMS messaging layer with ActiveMQ is a priority. There are a couple ways to achieve this, but without","og_url":"https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2012-09-07T01:00:00+00:00","article_modified_time":"2012-10-22T06:59:28+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","type":"image\/jpeg"}],"author":"Christian Posta","twitter_card":"summary_large_image","twitter_creator":"@http:\/\/twitter.com\/christianposta","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Christian Posta","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html"},"author":{"name":"Christian Posta","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/95b83ea6815f602e6feade679134c6ed"},"headline":"Benchmarking JMS layer with JMSTester","datePublished":"2012-09-07T01:00:00+00:00","dateModified":"2012-10-22T06:59:28+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html"},"wordCount":2096,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","keywords":["JMS"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html","url":"https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html","name":"Benchmarking JMS layer with JMSTester - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","datePublished":"2012-09-07T01:00:00+00:00","dateModified":"2012-10-22T06:59:28+00:00","description":"For most of the clients I\u2019ve been to, scaling out a JMS messaging layer with ActiveMQ is a priority. There are a couple ways to achieve this, but without","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","width":150,"height":150,"caption":"java-interview-questions-answers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/benchmarking-jms-layer-with-jmstester.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Benchmarking JMS layer with JMSTester"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/95b83ea6815f602e6feade679134c6ed","name":"Christian Posta","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7faea4e159f6ef9865e5819a901aaa74d4dee9e254741d8685c097dd691bc04a?s=96&d=mm&r=g","caption":"Christian Posta"},"description":"Christian is a Principal Consultant at FuseSource specializing in developing enterprise software applications with an emphasis on software integration and messaging. His strengths include helping clients build software using industry best practices, Test Driven Design, ActiveMQ, Apache Camel, ServiceMix, Spring Framework, and most importantly, modeling complex domains so that they can be realized in software. He works primarily using Java and its many frameworks, but his favorite programming language is Python. He's in the midst of learning Scala and hopes to contribute to the Apache Apollo project.","sameAs":["http:\/\/www.christianposta.com\/blog\/","http:\/\/www.linkedin.com\/pub\/christian-posta\/15\/412\/199","https:\/\/x.com\/http:\/\/twitter.com\/christianposta"],"url":"https:\/\/www.javacodegeeks.com\/author\/Christian-Posta"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/1860","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/204"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=1860"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/1860\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/112"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=1860"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=1860"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=1860"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}