TP6 : Java Message Service

Transcription

TP6 : Java Message Service
TP6 : Java Message Service
V. Danjean
Résumé
Le but de ce TP est de vous faire découvrir une partie de l'interface client de JMS. Vous
partirez d'un exemple complet qu'il faudra comprendre puis améliorer.
1
1.1
Introduction
Queues et Topics dans JMS
JMS est un ensemble de classe Java permettant de communiquer par messages entre applications. Deux paradigmes sont présents dans JMS : les Queues et les Topics. Dans les deux cas, un
client pourra envoyer et/ou recevoir des messages par l'intermédiaire de ces structures. La diérence vient du fait que dans une Queue, un message consommé par un client n'est plus accessible
aux autres clients, alors que dans un Topic, un message lu par un client reste disponible pour les
autres.
On peut voir une Queue comme une boîte aux lettres alors qu'un Topic serait plutôt comme
une radio que tout le monde peut écouter.
Si les packages javax.jms.* qui contiennent les classes Java de JMS ne sont pas
disponibles de manière native sur votre système, ajoutez dans votre CLASSPATH l'archive
geronimo-jms_1.1_spec-1.1.1.jar fournie.
Dans ce TP, nous nous intéresserons principalement aux Topics, mais il serait facile de le
changer pour gérer des Queues.
1.2
Infrastructure
Dans ce TP, nous ne regarderons que la partie client de JMS. Néanmoins, pour faire fonctionner
l'application, un serveur est nécessaire. Ce serveur tourne sur une machine indépendante, mais
votre client devra être capable de communiquer avec lui. C'est pourquoi vous devrez ajouter dans
votre CLASSPATH ces chiers JAR fournis : geronimo-j2ee-management_1.1_spec-1.0.1.jar,
commons-logging-1.1.jar et activemq-core-5.4.1.jar.
Note :
pilation.
ces trois archives Java ne sont nécessaires que lors de l'exécution et pas lors de la com-
L'interface administrative du serveur est accessible par le protocole HTTP sur le port 8161 de
la machine mandelbrot, dans le dossier admin/.
1
2
M1 Miage
Machines utilisables.
Ce TP demande Java 1.5 ou supérieur. Vous pouvez utiliser par exemple
les machines associées à l'alias imasrv-java (ou éventuellement les serveurs jpp et mandelbrot 1 ).
Si vous désirez utiliser vos machines personnelles, vous devez vous assurer que vous serez
capable de joindre le serveur JMS. Si vous êtes sous Linux (et probablement sous MacOS), vous
pouvez (après connexion au VPN) utiliser la commande pour propager les ports 61616 et 8161
dans un tunnel. Par exemple :
ssh -g -L 61616:localhost:61616 -L 8161:localhost:8161 mandelbrot.e.ujf-grenoble.fr
Vous devrez ensuite utiliser localhost comme nom de serveur JMS au lieu de mandelbrot.
Si vous avez le moindre problème, travaillez directement sur les machines de l'UFR.
2
Découverte de JMS avec l'application Chat
Nous vous proposons une application Java permettant de dialoguer entre plusieurs clients, un
peu à l'image des systèmes de messagerie instantanée. Cette application prend trois paramètres :
un nom de rubrique (Topic ), un nom d'utilisateur et un mot de passe.
L'application est décrite en détaille dans le document PDF joint ou encore à l'URL http:
//www.onjava.com/pub/a/onjava/excerpt/jms_ch2/index.html
2.1
Découverte de l'application fournie
Lisez ce document ainsi que le code source fourni. Regardez la javadoc 2 des classes qui vous
sont inconnues.
. Question 1. Listez les principales classes de JMS utilisées dans ce programme et expliquez
brièvement leur rôle.
Question 2. En positionnant correctement votre classpath, compilez et exécutez le programme
Java Chat en utilisant la rubrique test, le login de votre choix et un mot de passe quelconque (le
mot de passe n'est pas utilisé par l'application pour l'instant).
.
. Question 3. Combien de threads sont lancés dans cette application (côté client) ? Pourquoi ne
peut on se contenter d'un programme monothreadé ? (Pensez à regarder la section Sessions and
Threading du document décrivant l'application.)
2.2
Interaction avec le serveur JMS/JNDI
Pour fonctionner, JMS a besoin de références sur les objets partagés entre les diérents clients.
Pour récupérer ces références, le programme utilise JNDI. Ce serveur JNDI peut être vu comme
un annuaire : on lui donne un nom, il nous retourne un objet Java.
.
Question 4.
Quels sont les objets qui sont demandés au serveur JNDI ?
Pour l'instant, une seule rubrique existe sur le serveur. Elle est nommée test dans JNDI et
TP.test sur le serveur.
1. Attention : sur mandelbrot, le JDK installé par défaut est trop ancien pour ce TP. Il faut utiliser la version
installée dans
/opt/softs/jdk1.6.0_10/bin
2. La javadoc de
Java Enterprise Edition est disponible à l'URL http://download.oracle.com/javaee/6/api/
3
M1 Miage
.
Question 5.
Où est fait le lien entre le nom JNDI et le nom réel sur le serveur ?
Question 6. Modiez le programme pour que JNDI soit capable de référencer de nouvelles
rubriques. Vous pouvez vérier sur l'interface administrative du serveur que ces rubriques apparaissent (il n'est pas nécessaire de les créer manuellement : elles sont créées automatiquement
lorsqu'un programme s'en sert pour la première fois).
.
On aimerait maintenant éviter d'avoir à recompiler le programme chaque fois qu'on modie
la conguration de JNDI. Plutôt que de mettre les propriétés directement dans le programme, on
peut les mettre dans un chier. Il sut alors d'appeler ce chier jndi.properties et de le placer
à un endroit où java cherche ses classes (dans une archive JAR par exemple, ou encore dans un
répertoire du CLASSPATH).
.
Question 7.
Créez un chier jndi.properties avec le contenu suivant :
java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
# use the following property to configure the default connector
java.naming.provider.url = tcp://mandelbrot.e.ujf-grenoble.fr:61616
# register some topics in JNDI using the form
# topic.[jndiName] = [physicalName]
topic.test = TP.test
Faites en sorte que ce chier soit désormais utilisé pour la conguration de JNDI. Vériez que
vous pouvez maintenant référencer de nouvelles rubriques du serveur dans JNDI sans recompiler
l'application.
2.3
.
Création dynamique de rubriques
Question 8.
par JNDI ?
Que se passe-t-il lorsque l'on demande une rubrique dont le nom n'est pas trouvé
Question 9. Modiez le code de l'application pour qu'elle crée une rubrique avec le nom fourni
si la rubrique n'existe pas dans JNDI (regardez les méthodes disponibles dans l'interface Session
du package javax.jms).
.
2.4
En cas d'absence
Question 10. Que se passe-t-il si un lecteur n'est pas là lorsqu'un message est envoyé dans une
rubrique et s'il se reconnecte plus tard ?
.
Question 11. Quels seraient les changements à apporter (au client ou au serveur) pour permettre à un abonné de ne pas perdre de message ? Quelles implications cela aurait-il sur le serveur ?
Est-ce possible de le faire facilement en JMS ?
.
2.5
Infrastructure
ActiveMQ est une application pouvant (entre autre) servir de serveur JMS et JNDI (http:
//activemq.apache.org/).
4
M1 Miage
. Question 12. Pourquoi n'a-t-on pas besoin des chiers JARs commons-logging-1.1.jar,
geronimo-j2ee-management_1.1_spec-1.0.1.jar et activemq-core-5.4.1.jar pour la com-
pilation ?
Pourquoi ces chiers sont-ils nécessaires lors de l'exécution ?
Question 13. Si on changeait de serveur JMS/JNDI, quels seraient les changements à apporter
à notre application client ?
.
.
Question 14.
Citez quelques autres serveurs JMS existants (faites une recherche sur le web).

Documents pareils