{"id":799,"date":"2011-01-05T13:53:18","date_gmt":"2011-01-05T13:53:18","guid":{"rendered":"http:\/\/blog.milamberspace.net\/?p=799"},"modified":"2011-05-17T22:38:08","modified_gmt":"2011-05-17T22:38:08","slug":"jmeter-petit-test-jms-publication-abonnement-avec-activemq","status":"publish","type":"post","link":"https:\/\/blog.milamberspace.net\/index.php\/2011\/01\/05\/jmeter-petit-test-jms-publication-abonnement-avec-activemq-799.html","title":{"rendered":"JMeter\u00a0: petit test JMS Publication &#8211; Abonnement avec ActiveMQ"},"content":{"rendered":"<p>Pour faire suite \u00e0 ce billet qui montre un <a href=\"http:\/\/blog.milamberspace.net\/index.php\/2010\/09\/11\/jmeter-petit-test-jms-point-a-point-avec-activemq-737.html\">test JMS de type Point-\u00e0-Point<\/a>, voici un autre test JMS mais cette fois avec la notion d&rsquo;abonnement (subscriber) et de publication (publisher).<\/p>\n<p>Comme pour le premier test, nous continuons avec la messagerie orient\u00e9e message (MOM) <a href=\"http:\/\/activemq.apache.org\/\">Apache ActiveMQ<\/a>.<\/p>\n<p>Apr\u00e8s avoir t\u00e9l\u00e9charg\u00e9 l&rsquo;archive binaire d&rsquo;ActiveMQ, on le d\u00e9compresse, puis on le d\u00e9marre avec ces commandes\u00a0:<\/p>\n<pre>cd &lt;Repertoire_ActiveMQ&gt;\r\n.\/bin\/activemq start<\/pre>\n<p>Il est possible de v\u00e9rifier que le serveur ActiveMQ fonctionne bien en se connectant sur <a href=\"http:\/\/localhost:8161\/admin\/\">http:\/\/localhost:8161\/admin\/<\/a> correspondant \u00e0 l&rsquo;URL de l&rsquo;interface d&rsquo;administration.<\/p>\n<p>Du cot\u00e9 de JMeter voici comment ce pr\u00e9sente notre petit test\u00a0:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Script JMeter Pub \/ Sub\" src=\"\/wp-content\/images\/jmeter31-jms-pub-sub\/jms01.png\" alt=\"\" width=\"470\" height=\"237\" \/>Tout d&rsquo;abord, on notera la pr\u00e9sence de <strong>2 Groupes d&rsquo;unit\u00e9s<\/strong> : un r\u00e9serv\u00e9 pour l&rsquo;Abonnement et un autre pour la Publication. <!--more-->En effet, avec ces deux <strong>Groupes d&rsquo;unit\u00e9s<\/strong> on va demander \u00e0 JMeter de g\u00e9rer \u00ab\u00a0deux utilisateurs virtuels\u00a0\u00bb ind\u00e9pendamment, l&rsquo;un charg\u00e9 de publier des messages, l&rsquo;autre charg\u00e9 de profiter de son abonnement \u00e0 la file de messages c&rsquo;est-\u00e0-dire la r\u00e9ception des messages publi\u00e9s par l&rsquo;autre utilisateur.<\/p>\n<p><span style=\"text-decoration: underline;\">Regardons en d\u00e9tail\u00a0:<\/span><\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"JMeter : Groupes d'unit\u00e9s Abonnement\" src=\"\/wp-content\/images\/jmeter31-jms-pub-sub\/jms02.png\" alt=\"\" width=\"437\" height=\"261\" \/><\/p>\n<p>Tout d&rsquo;abord, on a le <strong>Groupe d&rsquo;unit\u00e9s<\/strong> r\u00e9serv\u00e9 \u00e0 l&rsquo;Abonnement, c&rsquo;est-\u00e0-dire la r\u00e9cup\u00e9ration des messages publi\u00e9s par le publieur. Ici on fait simple\u00a0: 1 utilisateur virtuel qui fait 4 it\u00e9rations.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"JMeter : Requ\u00eate JMS Abonnement\" src=\"\/wp-content\/images\/jmeter31-jms-pub-sub\/jms03.png\" alt=\"\" width=\"908\" height=\"372\" \/><\/p>\n<p>Ensuite vient la requ\u00eate <strong>JMS Abonnement<\/strong> avec les param\u00e8tres suivants\u00a0:<\/p>\n<ul>\n<li><strong>Fabrique de connexion \tinitiale\u00a0:<\/strong> org.apache.activemq.jndi.ActiveMQInitialContextFactory<\/li>\n<li><strong>URL du fournisseur\u00a0:<\/strong> tcp:\/\/localhost:61616 (les valeurs par d\u00e9faut de ActiveMQ)<\/li>\n<li><strong>Fabrique de connexion\u00a0:<\/strong> ConnectionFactory<\/li>\n<li><strong>Destination\u00a0: <\/strong>dynamicTopics\/MyStaticTopic1 (ici on utilise une fonctionnalit\u00e9 \td&rsquo;ActiveMQ avoir des Topics (sujets) qui sont cr\u00e9\u00e9s dynamiquement \td\u00e8s qu&rsquo;il est sollicit\u00e9) (sinon il faut cr\u00e9er le topic via \tl&rsquo;interface d&rsquo;administration d&rsquo;ActiveMQ)<\/li>\n<li><strong>Evaluer\u00a0: <\/strong>Au \td\u00e9marrage. Ici c&rsquo;est une nouvelle fonctionnalit\u00e9 ajout\u00e9e <strong>apr\u00e8s<\/strong> la version 2.4. C&rsquo;est en effet une <a href=\"http:\/\/jakarta.apache.org\/jmeter\/nightly.html\">version de d\u00e9veloppement<\/a> que \tj&rsquo;utilise ici. Par d\u00e9faut dans les versions &lt; 2.4 le nom de la \tDestination est \u00ab\u00a0static\u00a0\u00bb, il est lu au d\u00e9marrage du test \t(avant m\u00eame le lancement des unit\u00e9s d&rsquo;ex\u00e9cution) et reste fig\u00e9 \tdurant tout le tir, ce qui a pour cons\u00e9quence d&rsquo;interdire une \tvaleur contenant une variable JMeter). L&rsquo;option \u00ab\u00a0Au d\u00e9marrage\u00a0\u00bb \tcorrespond \u00e0 cette fonctionnalit\u00e9. L&rsquo;option \u00ab\u00a0A chaque \t\u00e9chantillon\u00a0\u00bb demande \u00e0 JMeter de proc\u00e9der \u00e0 l&rsquo;\u00e9valuation \tde la valeur de la Destination juste avant l&rsquo;ex\u00e9cution de la \trequ\u00eate. Cette option permet d&rsquo;avoir des variables JMeter dans le \tchamp Destination.<\/li>\n<li><strong>Nombre d&rsquo;\u00e9chantillons \u00e0 \tagr\u00e9ger\u00a0: <\/strong>1 (on r\u00e9cup\u00e8re 1 seul message par ex\u00e9cution)<\/li>\n<li><strong>D\u00e9lai\u00a0:<\/strong> 10000 ms \tcorrespondant au temps d&rsquo;attente maximum que la requ\u00eate JMS \tAbonnement va patienter pour recevoir un message avant de se mettre \ten \u00e9chec de r\u00e9cup\u00e9ration.<\/li>\n<\/ul>\n<p>Maintenant on passe au <strong>Groupe d&rsquo;unit\u00e9s<\/strong> r\u00e9serv\u00e9 \u00e0 la Publication.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Groupe d'unit\u00e9s Publication\" src=\"\/wp-content\/images\/jmeter31-jms-pub-sub\/jms-pub01.png\" alt=\"\" width=\"398\" height=\"262\" \/><\/p>\n<p>M\u00eame traitement\u00a0: 1 utilisateur virtuel qui fait 4 it\u00e9rations. (On garde ainsi une coh\u00e9rence avec le groupe d&rsquo;unit\u00e9s Abonnement.)<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"JMeter : Action test\" src=\"\/wp-content\/images\/jmeter31-jms-pub-sub\/jms-pub02.png\" alt=\"\" width=\"513\" height=\"163\" \/><\/p>\n<p>Ici on a l&rsquo;\u00e9l\u00e9ment <strong>Action test<\/strong> qui va faire faire une pause de 2 secondes \u00e0 l&rsquo;unit\u00e9. Pourquoi\u00a0? Parce qu&rsquo;il faut (pour ce sc\u00e9nario) \u00eatre certain que le topic (sujet) poss\u00e8de bien des requ\u00eates d&rsquo;Abonnement en \u00e9coute <strong>avant<\/strong> la publication d&rsquo;un message. On laisse ainsi le temps au Groupe d&rsquo;unit\u00e9s Abonnement d&rsquo;avoir sa requ\u00eate en \u00e9coute de la file.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"JMeter : Requ\u00eate JMS Publication\" src=\"\/wp-content\/images\/jmeter31-jms-pub-sub\/jms-pub03.png\" alt=\"\" width=\"903\" height=\"602\" \/><\/p>\n<p>On regarde maintenant les param\u00e8tres de la requ\u00eate de Publication JMS\u00a0:<\/p>\n<ul>\n<li><strong>Fabrique de connexion \tinitiale\u00a0:<\/strong> org.apache.activemq.jndi.ActiveMQInitialContextFactory<\/li>\n<li><strong>URL du fournisseur\u00a0:<\/strong> tcp:\/\/localhost:61616 (les valeurs par d\u00e9faut de ActiveMQ)<\/li>\n<li><strong>Fabrique de connexion\u00a0:<\/strong> ConnectionFactory<\/li>\n<li><strong>Destination\u00a0: <\/strong>dynamicTopics\/MyStaticTopic1 (ici on utilise un fonctionnalit\u00e9 \td&rsquo;ActiveMQ avoir des Topics (sujets) qui sont cr\u00e9\u00e9s dynamiquement \td\u00e8s qu&rsquo;il est sollicit\u00e9) (sinon il faut cr\u00e9er le topic via \tl&rsquo;interface d&rsquo;administration d&rsquo;ActiveMQ)<\/li>\n<li><strong>Evaluer\u00a0: <\/strong>Au \td\u00e9marrage. (voir l&rsquo;explication ci-dessus dans les param\u00e8tres de la \trequ\u00eate JMS d&rsquo;Abonnement)<\/li>\n<li><strong>Nombre d&rsquo;\u00e9chantillons \u00e0 \tagr\u00e9ger\u00a0: <\/strong>1 (on envoi 1 seul message par ex\u00e9cution)<\/li>\n<li><strong>Message texte:<\/strong> un simple \tmessage avec une fonction JMeter (time) pour avoir un timestamp.<\/li>\n<\/ul>\n<p>Voil\u00e0, il reste maintenant \u00e0 tester l&rsquo;ex\u00e9cution du sc\u00e9nario. Le serveur ActiveMQ est bien d\u00e9marr\u00e9, on lance le script (un petit CTRL-R).<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"R\u00e9sultats JMeter sur tir JMS Pub\/sub\" src=\"\/wp-content\/images\/jmeter31-jms-pub-sub\/jms-result01.png\" alt=\"\" width=\"658\" height=\"336\" \/><\/p>\n<p>Dans le r\u00e9cepteur <strong>Arbre de r\u00e9sultats<\/strong>, on peut observer les r\u00e9sultats. On peut y voir une alternance entre la Publication et l&rsquo;Abonnement. (apr\u00e8s chaque publication, le message publi\u00e9 est re\u00e7u par l&rsquo;\u00e9chantillon Abonnement).<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"R\u00e9sultats JMeter sur tir JMS Pub\/sub\" src=\"\/wp-content\/images\/jmeter31-jms-pub-sub\/jms-result02.png\" alt=\"\" width=\"772\" height=\"351\" \/><\/p>\n<p>Avec l&rsquo;onglet Requ\u00eate du r\u00e9cepteur <strong>Arbre de r\u00e9sultats<\/strong>, on peut avoir les d\u00e9tails de la requ\u00eate JMS, en particulier le <em>JMSMessageId<\/em> qui permet de faire (si besoin) un rapprochement entre l&rsquo;\u00e9mission et la r\u00e9ception des messages JMS.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"R\u00e9sultats JMeter sur tir JMS Pub\/sub\" src=\"\/wp-content\/images\/jmeter31-jms-pub-sub\/jms-result03.png\" alt=\"\" width=\"724\" height=\"463\" \/>Pour finir, on regarde un \u00e9l\u00e9ment JMS Abonnement, qui lui, indique qu&rsquo;un message a \u00e9t\u00e9 correctement re\u00e7u et affiche les d\u00e9tails de la requ\u00eate JMS, avec son <em>JMSMessageId<\/em>.<\/p>\n<p><span style=\"text-decoration: underline;\">On notera que\u00a0:<\/span> la requ\u00eate JMS Abonnement arrive <strong>apr\u00e8s<\/strong> la publication (ce qui est normal) dans l&rsquo;arbre de r\u00e9sultats, bien que la date de d\u00e9but d&rsquo;\u00e9chantillon (onglet <strong>R\u00e9sultat de l&rsquo;\u00e9chantillon<\/strong>) est 2 secondes plus t\u00f4t que la requ\u00eate JMS Publication pr\u00e9c\u00e9dente. Du coup le temps de r\u00e9ponse est de 2022 ms, car 1\/ les deux <strong>Groupes d&rsquo;unit\u00e9s <\/strong>d\u00e9marrent en m\u00eame temps, 2\/ mais celui de la Publication a un \u00e9l\u00e9ment <strong>Action test <\/strong>effectuant une pause de 2 secondes, 3\/ donc l&rsquo;\u00e9l\u00e9ment JMS Abonnement attends 2 secondes que l&rsquo;\u00e9l\u00e9ment Publication envoi son message, 4\/ et ainsi, on peut calculer (grossi\u00e8rement) un temps de r\u00e9ponse (r\u00e9cup\u00e9ration du message) r\u00e9el ici de 22 milli-secondes (2022 \u2013 2000 = 22).<\/p>\n<p>Voil\u00e0 pour cette tr\u00e8s petite introduction aux tests JMS Pub\/Sub.<\/p>\n<p>.\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pour faire suite \u00e0 ce billet qui montre un test JMS de type Point-\u00e0-Point, voici un autre test JMS mais cette fois avec la notion d&rsquo;abonnement (subscriber) et de publication (publisher). Comme pour le premier test, nous continuons avec la messagerie orient\u00e9e message (MOM) Apache ActiveMQ. Apr\u00e8s avoir t\u00e9l\u00e9charg\u00e9 l&rsquo;archive binaire d&rsquo;ActiveMQ, on le d\u00e9compresse, &hellip; <a href=\"https:\/\/blog.milamberspace.net\/index.php\/2011\/01\/05\/jmeter-petit-test-jms-publication-abonnement-avec-activemq-799.html\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">JMeter\u00a0: petit test JMS Publication &#8211; Abonnement avec ActiveMQ<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[32,33,34],"tags":[252,234,330,235,251,249,250],"class_list":["post-799","post","type-post","status-publish","format-standard","hentry","category-apache","category-jmeter","category-tests-de-charges","tag-abonnement","tag-activemq","tag-jmeter","tag-jms","tag-publication","tag-publisher","tag-subscriber"],"_links":{"self":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/799","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/comments?post=799"}],"version-history":[{"count":5,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/799\/revisions"}],"predecessor-version":[{"id":898,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/799\/revisions\/898"}],"wp:attachment":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/media?parent=799"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/categories?post=799"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/tags?post=799"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}