TP JMS Note
TP JMS Note
TP JMS Note
LYAZID 1
Dans un premier temps, aller sur la page https://activemq.apache.org/ télécharger la version ActiveMQ 5
"Classic".
Vérifier que vous avez java sur votre machine (version supérieure 1.7). Il suffit de lancer une commande
shell et de saisir l’instruction suivante : java –version. Si vous avez plusieurs versions, il suffit de modifier
le chemin vers la jdk adéquate. Si ce n’est pas le cas, renseigner la valeur JAVA_HOME dans la variable
environnement.
Ensuite ajouter une variable d’environnement ACTIVEMQ_HOME comme le montre les figures
suivantes :
S.LYAZID 2
Pour ce faire, il faut aller dans la variable d’environnement comme l’illustre la figure suivante :
1
2
3
1
La fin de la fenêtre de la console doit fournir les lignes suivantes (Si ce n’est pas le cas, lire les exceptions
sur la console afin de corriger et pouvoir lancer le broker activemq.) :
Gestion de ActiveMQ
Vous pouvez utiliser l’interface à partir de votre navigateur préféré (Google Chrome,
Mozilla, etc. ). Pour ce faire, saisir l’adresse suivant http://localhost:8161/admin ou
http://127.0.0.1:8161/admin ou tout simplement Dans le navigateur : http://localhost:8161/
User : admin pwd : admin
User : user, pwd :user
Vous pouver modifier le nom et les mots de passe dans le fichier :
apache-activemq-5.16.3\conf\ jetty-realm.properties (voir figures suivantes).
S.LYAZID 4
Queue
Topic
Dans le champ Queue Name, renseigner un nom de votre choix. Et faire un clic sur Create
La page suivante devrait afficher le nom de la queue, ensuite donner le nom de la queue dans le champ :
Queue Name
Faire un clic sur Q1 (ce nom peut être différent en fonction de ce que vous avez donné lors de la création
de votre queue)
Il faut ajouter le fichier jar ActiveMQ à votre application tp1JMS comme indiquer sur la figure
suivante. Vous avez appris forcément comment ajouter un fichier jar, soit directement à partir de build
Path ou en à partir d’une librairie de USER. Le fichier jar se trouve dans le répertoire :
S.LYAZID 8
Il faut faire un clic sur chaque sur chaque et importer le package adéquat.
S.LYAZID 9
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
+
A partir d’eclipse vous allez vous connecter au broker et créer une queue nommée
MyfirstQueuewithEclipse
Faire un clic sur Queues dans ActiveMq vous devez vérifier que la queue est créée
Dans ce qui suit nous allons lire le message à partir d’une application java.
Créer un projet Java, ensuite créer une classe Consumer dans un package com.bba ;
Copier le code suivant :
Destination destination;
MessageConsumer consumer = null;
TextMessage message;
boolean useTransaction = false;
try {
connectionFactory = new ActiveMQConnectionFactory();
destination = new ActiveMQQueue("MyfirstQueuewithEclipse");
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(useTransaction,
Session.AUTO_ACKNOWLEDGE);
consumer = session.createConsumer(destination);
message = (TextMessage) consumer.receive();
System.out.println("Received message: " + message);
} catch (JMSException jmsEx) {
} finally {
try {
consumer.close();
session.close();
connection.close();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Importer le fichier jar ActiveMQ à partir de la librairie créée précédemment, de mon côté j’ai donné le
nom MQLibrary.
Aller à la fin de la console, vous allez visualiser le message envoyé à partir de la classe Producer.
Actualiser le navigateur, le broker vous informe que le message a été retiré de la queue. Cette information
est donnée par l’onglet : Messages Enqueued (figure suivante)
Concumer.java
Exécuter le code de la classe , aucune information n’est obtenue car le message est déjà
lu.
S.LYAZID 13
Essayer de rentrer un nouveau message via le broker, cette fois-ci vous allez visualiser sur eclipse le
message envoyé dans le broker sans réexécuté le code de la classe. En effet, le consommateur côté eclipse
était en attente d’un message.
Topic Application.
Dans cette application, vous allez créer un Topic (implémenter le principe publich/subscribe). Il
s’agit ici d’envoyer un seul message, plusieurs consommateurs peuvent recevoir le même message. Pour
ce faire, créer un projet java. Puis, créer une classe java et copier le même code de Producer. Dans ce
nouveau code, il faut modifier la ligne :
destination = session.createQueue("MyfirstQueuewithEclipse"); par la ligne
suivante :
destination = session.createTopic("TopicwithEclipse");
Si vous lancez plusieurs consommateurs dans eclipse, alors ils vont tous recevoir le même message. Par
conter avec Queue, un seul va recevoir le message , voir les deux figures juste après.
Par contre la figure suivante montre le principe principe point-to-point (Queue), où un seul
processus reçoit un message. Remarquer que le processus qui a reçu le message meurt, figure A, et que
les autres sont encore en attente de message (les points (voyants) rouge indiquent que les processus sont
actifs, tandis que le premier est éteint). Ainsi, envoyer un autre message permettra à un seul processus
parmi les trois restant d’intercepter le message (voir la figure B).
Figure A 1
S.LYAZID 15
Figure B 1
Dans ce qui suit vous allez apprendre à réaliser une application pour gérer les capteurs de
manières asynchrone via le protocole JMS.
Pour comprendre le but du travail ci-après, il faut remarquer que lors de l’exécution du code ci-dessous,
tous souscripteur (subscriber) s’arrête (meurt) une fois qu’il reçoit le message. En principe ce cas ne
devrait pas se produire. Pour ce faire, vous devrez faire ce qui suit :
1- Créer un listener
2- Pour les besoins de ce test, créer un objet java sérialisé a échangé via le réseau
Les deux points ci-dessus sont réalisé dans le code des classes suivantes. Dans un premier temps,
commencer à créer un package nommé listener.mq dans un nouveua projet java (vous pouvez donner le
nom qui vous convient), ensuite copier les classes avec le code. Ne pas oublier surtout d’importer la
librairie:
package listener.mq;
import java.io.Serializable;
package listener.mq;
import java.util.Properties;
import javax.jms.JMSException;
import javax.jms.Topic;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQTopic;
tcon.setMessageListener(new ConsumerMsgListener());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
S.LYAZID 17
package listener.mq;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
public class ProducerViaTopicLitener {
ActiveMQConnectionFactory connectionFactory;
Connection connection = null;
Session session = null;
Destination destination;
Message message;
boolean useTransaction = false;
MessageProducer producer = null;
public ProducerViaTopicLitener () {
try {
connectionFactory = new ActiveMQConnectionFactory();
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(useTransaction, Session.AUTO_ACKNOWLEDGE);
destination = session.createTopic("TopicListener");
producer = session.createProducer(destination);
publish();
} catch (JMSException jmsEx) {
} finally {
try {
producer.close();
session.close();
connection.close();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void publish() throws JMSException {
BufferedReader entree = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("Saisir votre texte:");
try {
MyMsg msg = new MyMsg();
ligne = entree.readLine();
msg.setTexte(ligne);
ObjectMessage _message = session.createObjectMessage(msg);
producer.send(_message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
package listener.mq;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
@Override
public void onMessage(Message message) {
ObjectMessage myobject=(ObjectMessage) message;
MyMsg mess = null;
try {
Une fois que le code compile. Lire listing de chaque classe pour y essayer de comprendre un peu (nous
allons vois le détail pendant les séances de TPs).
Remarque : pour des raisons de sécurité, si vous retirer la ligne
factory.setTrustAllPackages(true);
dans la classe ClientTopListener, alors l’échange d’Objet java même sérialisé
ne sera pas autorisé (pour plus de détails voir lien :
https://activemq.apache.org/objectmessage
Avant d’exécuter le code, il faut ouvrir le fichier wrapper.conf qui se trouve apache-activemq-
5.16.3\bin\win64 (si ‘os est 64, sinon ouvrir celui qui est dans apache-activemq-5.16.3\bin\win32)
Ajouter la ligne suivante :
wrapper.java.additional.13=-Dorg.apache.activemq.SERIALIZABLE_PACKAGES="*"
Travail à faire :
1- Arrêter les processus dans eclispe
2- Aller sur le navigateur est supprimer TopicListener. Pour
ce faire, sélectionner delete dans l’onglet Operations
3- Ensuite exécuter la classe ProducerViaTopicLitener.
Saisir ensuite dans la console le texte suivant : Ceci est
mon premier message.
4- Exécuter la classe ClientTopListener (2 ,3 ,… comme
vous le souhaitez)
5- Qu’est-ce que vous remarquez ?
6- Saisir le texte : Ceci est mon second message
dans la console de ProducerViaTopicLitener comme le
montre la figure suivante
Question : le premier message n’a pas été récupéré, tous les clients ont raté ce message. Proposez
une solution pour résoudre ce problème ?
S.LYAZID 20
7- Dans les exemples ci-dessus, nous avons des clients qui écoutent soient sur une Queue ou Topic,
Question : on vous demande de créer un client qui écoute sur une Queue en mode Listener et
Topic Listener.
Question : Supprimer un message après un certain temps si aucun client ne récupère le message.
Question : Créer un client qui se connecte, se déconnecte et se reconnecte une seconde fois.
Alors ce client ne devrait pas perdre tous les messages qui lui sont destinés ?