{"id":737,"date":"2010-09-11T22:38:41","date_gmt":"2010-09-11T22:38:41","guid":{"rendered":"http:\/\/blog.milamberspace.net\/?p=737"},"modified":"2011-05-17T22:38:54","modified_gmt":"2011-05-17T22:38:54","slug":"jmeter-petit-test-jms-point-a-point-avec-activemq","status":"publish","type":"post","link":"https:\/\/blog.milamberspace.net\/index.php\/2010\/09\/11\/jmeter-petit-test-jms-point-a-point-avec-activemq-737.html","title":{"rendered":"JMeter: petit test JMS Point \u00e0 point avec ActiveMQ"},"content":{"rendered":"<p>Nous allons, dans ce petit billet, monter un sc\u00e9nario JMeter pour ex\u00e9cuter un test d&rsquo;un serveur de <a href=\"http:\/\/fr.wikipedia.org\/wiki\/MOM\">Messagerie Orient\u00e9e Messages (MOM)<\/a>. Pour ce dernier, nous allons prendre <a href=\"http:\/\/activemq.apache.org\/\">Apache ActiveMQ<\/a>, sachant qu&rsquo;il existe d&rsquo;autres MOM comme IBM WebSphere MQ (ex-MQSeries), Tibco, etc.<br \/>\nIci, nous allons montrer un test <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Java_Message_Service\">JMS en Point-\u00e0-Point<\/a>. L&rsquo;autre type de test possible en JMS est la Publication-Abonnement (Publisher-Subscriber), celui-ci fera l&rsquo;objet d&rsquo;un autre billet.<\/p>\n<p>Un des pr\u00e9-requis est d&rsquo;avoir un serveur ActiveMQ d\u00e9marr\u00e9. Pour cela (et pour faire simple), il suffit de t\u00e9l\u00e9charger <a href=\"http:\/\/activemq.apache.org\/download.html\">les fichiers binaires depuis le site Apache ActiveMQ<\/a>, de d\u00e9compresser l&rsquo;archive, d&rsquo;aller dans le r\u00e9pertoire de d\u00e9compression et ex\u00e9cuter la commande suivante :<\/p>\n<pre>.\/bin\/activemq start<\/pre>\n<p><!--more--><br \/>\nEnsuite, vous pouvez v\u00e9rifier que cela fonctionne en visitant l&rsquo;interface d&rsquo;administration \u00e0 l&rsquo;adresse suivante<strong> http:\/\/localhost:8161\/admin\/<\/strong><\/p>\n<p><strong><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" title=\"Interface d'administration de ActiveMQ\" src=\"\/wp-content\/images\/jmeter29-jms-point-to-point\/activemq-01.png\" alt=\"\" width=\"573\" height=\"534\" \/><br \/>\n<\/strong><\/p>\n<p>On reviens \u00e0 JMeter maintenant et notre petit tutoriel sur l&rsquo;utilisation de JMeter pour tester ActiveMQ.<\/p>\n<p>Une \u00e9tape pr\u00e9alable est de r\u00e9cup\u00e9rer les fichiers JAR d&rsquo;ActiveMQ afin de permettre \u00e0 JMeter de \u00ab\u00a0<em>parler JMS<\/em>\u00a0\u00bb avec votre serveur ActiveMQ. Le mieux est de prendre l&rsquo;archive <strong>activemq-all-X.X.X.jar<\/strong> (X.X.X en fonction de la version) \u00e0 partir du r\u00e9pertoire ActiveMQ d\u00e9compress\u00e9, puis de placer le fichier JAR dans le r\u00e9pertoire<em> JMETER_HOME\/lib<\/em>. L&rsquo;aide officielle pour cette \u00e9tape est <a href=\"http:\/\/jakarta.apache.org\/jmeter\/usermanual\/get-started.html#libraries_activemq\">ici<\/a>.<\/p>\n<p>Voici maintenant notre plan de test tout simple pour illustrer un test JMS sur une file \u00ab\u00a0point \u00e0 point\u00a0\u00bb.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Plan de test JMeter pour JMS point-\u00e0-point\" src=\"\/wp-content\/images\/jmeter29-jms-point-to-point\/jms-point-to-point-01.png\" alt=\"\" width=\"492\" height=\"204\" \/><\/p>\n<p>On aura dans ce plan de test, un groupe d&rsquo;unit\u00e9s, appel\u00e9 <strong>GU Point-\u00e0-Point<\/strong>, avec seulement un utilisateur, qui monte en charge en une seconde et qui fera trois it\u00e9rations.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Groupe d'unit\u00e9s JMeter pour JMS Point-\u00e0-point\" src=\"\/wp-content\/images\/jmeter29-jms-point-to-point\/jms-point-to-point-02.png\" alt=\"\" width=\"422\" height=\"276\" \/><\/p>\n<p>Ensuite, on en vient \u00e0 la <strong>Requ\u00eate JMS Point-\u00e0-point<\/strong> qui va faire tout le travail. C&rsquo;est-\u00e0-dire, qu&rsquo;elle va d\u00e9poser un message sur une file de requ\u00eate (Q.REQ) et lire sur une file de r\u00e9ception le message qu&rsquo;elle a d\u00e9pos\u00e9 (Q.RPL).<\/p>\n<p style=\"text-align: center;\"><img decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"JMeter : Requ\u00eate JMS Point-\u00e0-point\" src=\"\/wp-content\/images\/jmeter29-jms-point-to-point\/jms-point-to-point-03.png\" alt=\"\" \/><\/p>\n<p>Voici quelques commentaires ou explications sur les champs de cet \u00e9l\u00e9ment JMS Point-\u00e0-point :<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"4\" width=\"100%\">\n<tbody>\n<tr valign=\"TOP\">\n<td width=\"17%\"><strong>Champs<\/strong><\/td>\n<td width=\"21%\"><strong>Valeurs<\/strong><\/td>\n<td width=\"62%\"><strong>Commentaires<\/strong><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td width=\"17%\">Nom<\/td>\n<td width=\"21%\">JMS Point-to-Point ${__time(,TIMESTAMP)}<\/td>\n<td width=\"62%\">Afin de faciliter le d\u00e9bogage, \t\t\tj&rsquo;utilise la date en secondes dans le nom de l&rsquo;\u00e9l\u00e9ment (qui \t\t\ts&rsquo;affichera donc dans les r\u00e9cepteurs de r\u00e9sultats)<\/p>\n<p>Par ailleurs, je d\u00e9pose dans la variable ${TIMESTAMP} la \t\t\tvaleur de la date, pour une utilisation dans le contenu du message \t\t\t(ci-dessous)<\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td width=\"17%\">Fabrique QueueConnection<\/td>\n<td width=\"21%\">ConnectionFactory<\/td>\n<td width=\"62%\"><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td width=\"17%\">Nom JNDI de la file d&rsquo;attente Request<\/td>\n<td width=\"21%\">Q.REQ<\/td>\n<td width=\"62%\">Le nom JNDI permettant \u00e0 JMeter de faire la liaison entre la \t\t\tfabrique de connexion et la file<\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td width=\"17%\">Nom JNDI de la file d&rsquo;attente Receive<\/td>\n<td width=\"21%\">Q.RPL<\/td>\n<td width=\"62%\">Le nom JNDI permettant \u00e0 JMeter de faire la liaison entre la \t\t\tfabrique de connexion et la file<\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td width=\"17%\">Type de communication<\/td>\n<td width=\"21%\">Requ\u00eate R\u00e9ponse (ou Requ\u00eate seule)<\/td>\n<td width=\"62%\">Ici on fait un type de communication \t\t\tRequ\u00eate (d\u00e9p\u00f4t) puis R\u00e9ponse (r\u00e9cup\u00e9ration).<\/p>\n<p>L&rsquo;autre option possible est la requ\u00eate seule (donc les \t\t\tmessages doit \u00eatre d\u00e9pil\u00e9s via soit une autre application, soit \t\t\tune requ\u00eate JMS Abonnement)<\/td>\n<\/tr>\n<tr>\n<td colspan=\"3\" width=\"100%\" valign=\"TOP\">Champs alternatifs pour la correspondance de message<\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td width=\"17%\">Utiliser l&rsquo;ID du message Request<\/td>\n<td width=\"21%\">non coch\u00e9<\/td>\n<td width=\"62%\">On peut laisser JMeter utiliser l&rsquo;identifiant du message \t\t\tRequest (d\u00e9p\u00f4t) pour faire la corr\u00e9lation entre le message \t\t\td\u00e9pos\u00e9 et r\u00e9cup\u00e9r\u00e9<\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td width=\"17%\">Utiliser l&rsquo;ID du message Response<\/td>\n<td width=\"21%\">non coch\u00e9<\/td>\n<td width=\"62%\">On peut laisser JMeter utiliser l&rsquo;identifiant du message \t\t\tResponce (r\u00e9cup\u00e9ration) pour faire la corr\u00e9lation entre le \t\t\tmessage d\u00e9pos\u00e9 et r\u00e9cup\u00e9r\u00e9<\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td width=\"17%\">D\u00e9lai (ms)<\/td>\n<td width=\"21%\">30000<\/td>\n<td width=\"62%\">Ce d\u00e9lai d&rsquo;attente est utilis\u00e9 lors de la r\u00e9ception du \t\t\tmessage (File Receive), si JMeter ne r\u00e9cup\u00e8re rien dans le d\u00e9lai \t\t\t(ici de 30 sec), alors l&rsquo;\u00e9l\u00e9ment sera marqu\u00e9 en erreur<\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td width=\"17%\">Utiliser un mode de livraison non persistant ?<\/td>\n<td width=\"21%\">non coch\u00e9<\/td>\n<td width=\"62%\"><\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td width=\"17%\">Contenu<\/td>\n<td width=\"21%\">\u00ab\u00a0Message de test ID TEMPS = ${TIMESTAMP}\u00a0\u00bb<\/td>\n<td width=\"62%\">Voici le contenu de mon message.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"3\" width=\"100%\" valign=\"TOP\">Propri\u00e9t\u00e9s JMS<\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td width=\"17%\">JMSCorrelationId<\/td>\n<td width=\"21%\">Milamber-${__time(,)}<\/td>\n<td width=\"62%\">Ici, j&rsquo;ai mis mon propre identifiant de corr\u00e9lation de \t\t\tmessage, Milamber accol\u00e9 de la date (en nombre de secondes depuis \t\t\tle 1er Janvier 1970)<\/td>\n<\/tr>\n<tr>\n<td colspan=\"3\" width=\"100%\" valign=\"TOP\">Propri\u00e9t\u00e9s JNDI<\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td width=\"17%\">Fabrique de connexion initiale<\/td>\n<td width=\"21%\">org.apache.activemq.jndi.ActiveMQInitialContextFactory<\/td>\n<td width=\"62%\">La classe \u00e0 invoquer pour cr\u00e9er une connexion sur la \t\t\tmessagerie orient\u00e9e message.<\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td width=\"17%\">queue.Q.REQ<\/td>\n<td width=\"21%\">example.A<\/td>\n<td width=\"62%\">Correspondance entre le nom JNDI de la file (Q.REQ) et le nom \t\t\tr\u00e9el de la file dans ActiveMQ (example.A)<\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td width=\"17%\">queue.Q.RPL<\/td>\n<td width=\"21%\">example.B<\/td>\n<td width=\"62%\">Correspondance entre le nom JNDI de la file (Q.RPL) et le nom \t\t\tr\u00e9el de la file dans ActiveMQ (example.B)<\/td>\n<\/tr>\n<tr valign=\"TOP\">\n<td width=\"17%\">URL du fournisseur<\/td>\n<td width=\"21%\">tcp:\/\/localhost:61616<\/td>\n<td width=\"62%\">L&rsquo;adresse et le port pour attaquer l&rsquo;ActiveMQ.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Il ne reste plus qu&rsquo;\u00e0 lancer le micro-test :<\/p>\n<p>L&rsquo;arbre de r\u00e9sultats nous montre une ex\u00e9cution r\u00e9ussie \ud83d\ude09<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"JMeter : ex\u00e9cution du test JMS Point-\u00e0-point\" src=\"\/wp-content\/images\/jmeter29-jms-point-to-point\/jms-point-to-point-04.png\" alt=\"\" width=\"814\" height=\"669\" \/><\/p>\n<p>Et l\u00e0, la capture d&rsquo;\u00e9cran du contenu de message.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"JMeter test JMS message de reponse\" src=\"\/wp-content\/images\/jmeter29-jms-point-to-point\/jms-point-to-point-05.png\" alt=\"\" width=\"805\" height=\"204\" \/><\/p>\n<p>Pour revenir \u00e0 ActiveMQ et sa console, \u00e0 partir de celle-ci on peut voir (surveiller) les messages d\u00e9pos\u00e9s\/lues dans les files.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" title=\"Console ActiveMQ\" src=\"\/wp-content\/images\/jmeter29-jms-point-to-point\/activemq-02.png\" alt=\"\" width=\"733\" height=\"534\" \/><\/p>\n<p>On peut \u00e9galement voir les connexions ouvertes par JMeter pendant le tir. Au total 2 connexions (une pour le d\u00e9p\u00f4t et une pour la lecture).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" title=\"ActiveMQ voir les connexions sur les files\" src=\"\/wp-content\/images\/jmeter29-jms-point-to-point\/activemq-03.png\" alt=\"\" width=\"733\" height=\"534\" \/><\/p>\n<p><strong><span style=\"text-decoration: underline;\">Quelques commentaires :<\/span><\/strong><\/p>\n<ul>\n<li> En interne, JMeter d\u00e9marre le JMS Listener (le processus d&rsquo;\u00e9coute) sur la file de r\u00e9ception avant m\u00eame le d\u00e9but du test (au moment de la compilation de l&rsquo;arbre du script JMeter). Ce qui signifie que <em>le nom de la file ne supporte pas les variables JMeter non d\u00e9finies au moment du lancement du test <\/em>(donc une variable r\u00e9cup\u00e9r\u00e9e via un extracteur d&rsquo;expression r\u00e9guli\u00e8re ne fonctionne pas, ou bien des noms de files JMS qui sont r\u00e9cup\u00e9r\u00e9es via une Source de donn\u00e9es CSV).<\/li>\n<li> L&rsquo;aide officielle de JMeter sur les tests JMS est ici (<a href=\"http:\/\/jakarta.apache.org\/jmeter\/usermanual\/component_reference.html#JMS_Point-to-Point\">JMS Point-to-Point<\/a>) et l\u00e0 (<a href=\"http:\/\/jakarta.apache.org\/jmeter\/usermanual\/build-jms-point-to-point-test-plan.html\">Building a JMS Point-to-Point Test Plan<\/a>).<\/li>\n<li> Un lien vers un tutoriel<a href=\"http:\/\/www.ibm.com\/developerworks\/websphere\/library\/techarticles\/0808_vandekuil\/0808_vandekuil.html?ca=drs-\"> IBM pour utiliser JMeter avec WebSphere MQ<\/a><\/li>\n<\/ul>\n<p>.\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nous allons, dans ce petit billet, monter un sc\u00e9nario JMeter pour ex\u00e9cuter un test d&rsquo;un serveur de Messagerie Orient\u00e9e Messages (MOM). Pour ce dernier, nous allons prendre Apache ActiveMQ, sachant qu&rsquo;il existe d&rsquo;autres MOM comme IBM WebSphere MQ (ex-MQSeries), Tibco, etc. Ici, nous allons montrer un test JMS en Point-\u00e0-Point. L&rsquo;autre type de test possible &hellip; <a href=\"https:\/\/blog.milamberspace.net\/index.php\/2010\/09\/11\/jmeter-petit-test-jms-point-a-point-avec-activemq-737.html\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">JMeter: petit test JMS Point \u00e0 point 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,169,34],"tags":[234,330,235,236],"class_list":["post-737","post","type-post","status-publish","format-standard","hentry","category-apache","category-jmeter","category-test-fonctionnel","category-tests-de-charges","tag-activemq","tag-jmeter","tag-jms","tag-point-a-point"],"_links":{"self":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/737","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=737"}],"version-history":[{"count":11,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/737\/revisions"}],"predecessor-version":[{"id":745,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/737\/revisions\/745"}],"wp:attachment":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/media?parent=737"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/categories?post=737"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/tags?post=737"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}