JMS: Un exemple vraiment simple
JMS : Java Messaging Service
L’API JMS est une API de messagerie qui permet à des applications de créer, envoyer, recevoir et lire des messages. C’est un système de communication distribué, faiblement lié (”loosely coupled”), fiable et asynchrone.
C’est une norme.
C’est un des piliers de J2EE.
Je propose un exemple ultra-simple, permettant de se familiariser avec cette API.
Je ne fait pas appel volontairement à JNDI, ce qui limite la portée de JMS à une seule application: cela suffit parfois (et j’aime cette idée de juste suffisant), et cela permet de se familiariser avec cette API.
Il faut une implémentation de la l’API jms : Sun propose un produit … gratuit: Sun Java System Message Queue 3 2005Q1 Platform Edition.
Après l’avoir télécharger, il faut mettre jms.jar et imq.jar dans le classpath de notre exemple.
Voilà le fichier source SimpleQueueSender.java (A mettre donc dans les répertoires bg/testJms/):
- package bg.testJms;
- import javax.jms.QueueConnectionFactory;
- import javax.jms.QueueConnection;
- import javax.jms.QueueSession;
- import javax.jms.QueueSender;
- import javax.jms.QueueReceiver;
- import javax.jms.Queue;
- import javax.jms.Session;
- import javax.jms.Message;
- import javax.jms.TextMessage;
- public class SimpleQueueSender {
- private static int nbMessagesTest = 5;
- QueueConnectionFactory myQConnFactory = new com.sun.messaging.QueueConnectionFactory();
- QueueConnection myQConn = myQConnFactory.createQueueConnection();
- QueueSession myQSess = myQConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
- Queue myQueue = new com.sun.messaging.Queue("world");
- QueueSender myQueueSender = myQSess.createSender(myQueue);
- for (int i = 0; i < nbMessagesTest; i++) {
- TextMessage myTextMsg = myQSess.createTextMessage();
- myTextMsg.setText("Hello World " + i);
- myQueueSender.send(myTextMsg);
- }
- //envoyer un message de fin de session
- myQueueSender.send(myQSess.createMessage());
- //
- QueueReceiver myQueueReceiver = myQSess.createReceiver(myQueue);
- myQConn.start();
- Message msg;
- boolean isOn = true;
- int j=0;
- while (isOn) {
- j++;
- msg = myQueueReceiver.receive();
- if (msg instanceof TextMessage) {
- TextMessage txtMsg = (TextMessage) msg;
- }else {
- isOn = false;
- }
- }
- myQSess.close();
- myQConn.close();
- }
- }
Quelques commentaires:
- QueueConnectionFactory, QueueConnection, QueueSession, QueueSender,QueueReceiver, Queue, Session, Message: appartiennent à l’API jms (Dans jms.jar dans notre cas) et sont des Interfaces. C’est la traduction de la norme jsr 914. Ce sont des javax (Lire java eXtension) , et donc des classes de base. (Elles sont dans jeejava.jar). elles ne sont cependant pas (Ou pas encore) cependant dans la JRE de base.
com.sun.messaging.QueueConnectionFactory est une implémentation de l’API Jms. Elle est livrée dans un autre jar (imq.jar dans notre exemple). Il existe de nombreuses implémentations (Certaines libre, d’autre payantes ….) de l’API jms. -
Le principe à retenir est le suivant: Un message est écrit dans une queue, et il est lu une seule fois à un autre rythme par un seul destinataire.
Par exemple vous voulez réaliser une fonction qui prend du temps (Faire un transfert ftp, envoyer un mail à un serveur smtp, commiter des données dans une base de donnée …) vous un envoyé un message par jms, et la tache est réalisée quand le client destinataire est disponible . -
L’inconvénient sur cet exemple, c’est que l’envoyeur et le destinataire doivent s’exécuter dans la même JRE et doivent partager une référence commune.Ouep ! Pas très réparti! Un peu limité!
Attendez de découvrir JNDI! Un prochain tuto peut être…. -
Nous avons vu sur notre exemple un communication dit Point To Point. Il existe un autre mode de communication (publish/souscribe) où les consommateurs s’abonne à un sujet (topic) et ou l’émetteur ne connait pas les destinataires. Essayer de le trouver tout seul!
Ce tutoriel vous a aidé?
antoine.guiral.info
bertrand.guiral.info
ertrand Guiral : formateur et consultant
















Laissez un commentaire