Vous êtes sur la page 1sur 9

LAPI

JMS

Java Messaging Service

Quest ce que cest ?


JMS dfini un ensemble dinterfaces pour crer des applications de messageries en Java ; le jdkee1.3 inclus un JMS provider (implment des spcifications et qui peut servir de plate-forme dvaluation) ; JMS ne dfinit pas les fonctionnalits suivantes qui restent la discrtion du provider : une scurisation des messages ; le balancement de charges ; la tolrances aux fautes ; une administration du fonctionnement du provider ; la possibilit de dfinir de nouveaux types de messages ; la possibilit de rveiller un client quand des messages arrivent.
Benot Charroux - API - Mars 02 - 3

Le format des messages

Les messages JMS


Les messages JMS sont composs dune en-tte, de proprits optionnelles et dun corps : en-tte proprits corps une API permet de crer des messages pour des applications non JMS ; les possibilits sont suffisamment diversifies pour dvelopper des applications htrognes qui saffranchissent des diffrences systmes, architecturales et langages ; les proprits : faites pour ajouter des en-ttes optionnelles ; utilises pour demander au JMS provider de slectionner des messages recevoir ; il y a des proprits pr-dfinies : JMSXUserID, JMSXDeliveryCount,
Benot Charroux - API - Mars 02 - 5

Les en-ttes des messages (1/2)


JMSMessageID : identifiant unique du message sous forme dune chane commenant par ID (rempli par le MOM) ; JMSDestination : destinataire du message (rempli par le MOM) ; JMSDeliveryMode : persistant : le message est stock, et restaur en cas de panne du JMS provider pendant la phase de transit ; non persistant ; JMSTimestamp : JMSCorrelationID : permet de lier un message un autre (pour un message de rponse par exemple) ; JMSReplyTo : contient une destination fournie par lmetteur afin de lui rpondre ; JMSRedelivered : boolen prcisant que le message a, peut tre, dj t dlivr ;
Benot Charroux - API - Mars 02 - 6

Les en-ttes des messages (2/2)


JMSType : type du message (non spcifi par JMS) ; JMSExpiration : dure de vie du message donne en argument dun envoie (0 pour un message qui nexpire pas) ; initialis par le JMS provider ds que le message lui a t confi ; le message ne sera pas envoy au destinataire si la dure de vie est expire (le message doit tre considr comme dtruit) ; JMSPrioriry : donn par lmetteur ; fix par le provider ds quun message lui a t confi ; valeur comprise entre 0 et 9 (0 priorit minimale ; 4 priorit normale ; 9 priorit maximale) ; la priorit nimpose pas forcment un ordre sur les messages : cest du best effort !

Le corps des messages

Benot Charroux - API - Mars 02 - 7

Les diffrents messages


StreamMessage : flot de valeurs de type primitif Java ; MapMessage : ensemble de paires noms / valeurs o les noms sont de type String et les valeurs de type primitif Java ; TextMessage : texte sous forme dune String ; ObjectMessage : message contenant un objet Java srialis ; BytesMessage : flot binaire non interprts.

Les applications JMS

Il est possible de crer des messages pour des clients non JMS, on utilise alors : les BytesMessages ; les MapMessages ou les StreamMessages pour lmission (le JMS provider transforme alors le message au format du client non JMS).

Benot Charroux - API - Mars 02 - 9

Les objets administrables et programmables


1. Certains objets prdfinis sont accessibles par commandes plutt que par programmation : pour dcharger le dveloppeur dune application ; pour pouvoir tre implments diffremment suivant les provider ;

Les objets administrables et programmables


administration 2. programmation

Exemple de commandes (pour le j2sdkee1.3) de cration dune file de nom nomJNDIQueue : j2eeadmin addJmsDestination nomJNDIqueue 1 - cration

Exemple dun programme client qui recherche une file : lookup( nomJNDIQueue );

Il y a deux catgories dobjets administrables : Les fabriques de connexion utilises pour crer une connexion avec un provider ; Les destinations (files ou sujets) qui peuvent tre cres par des commandes. Outil dadministration bind Espace de nommage JNDI
Benot Charroux - API - Mars 02 - 11

2 - recherche

3 - utilisation

provider

Benot Charroux - API - Mars 02 - 12

Cration et accs une fabrique et une file (1/5)


Commande de cration dune fabrique : j2eeadmin addJmsFactory nomJNDIFactory queue Fabrique de connexion

Les tapes du dveloppement dune application JMS : exemple dune file de messages

Accs la fabrique par programme : QueueConnectionFactory factory = lookup( " nomJNDIFactory " ); Commande de cration dune file : j2eeadmin addJmsDestination nomJNDIQueue queue Queue ou sujet Accs la file par programme : Queue queue = lookup( " nomJNDIQueue " );
Benot Charroux - API - Mars 02 - 14

Les objets dune application (2/5)


Fabrique de connexion Une connection est un objet qui encapsule une connexion spcifique une provider (une socket TCP/IP par exemple). connection Une session est un objet qui va permettre de crer des producteurs, des consommateurs et des messages. producteur session consommateur

La programmation dune application (3/5)


Fabrique de connexion

QueueConnection connection = factory.createQueueConnection() ;

connection QueueSession session = connection.createQueueSession( ) ;

session QueueSender sender = QueueReceiver receiver = session.createSender( nomJNDIQueue ) ; session.createReceiver( nomJNDIQueue ) ; producteur Queue ou sujet sender.send( message ) ;
Benot Charroux - API - Mars 02 - 16

Un producteur est un objet qui va envoyer des messages une file du provider.

Queue

Un consommateur est un objet qui va recevoir des messages dune file.

consommateur

Benot Charroux - API - Mars 02 - 15

La consommation de messages en mode synchrone (4/5)

La consommation de messages en mode asynchrone (5/5)


Le consommateur reoit les messages ds que le provider en dispose ;

Les messages sont rcuprs linitiative du consommateur ; exemple dune file de messages :

exemple dune file de messages : public class Listener implements MessageListener{ public void onMessage(Message message) {

QueueConnection connection = factory.createQueueConnection() ; QueueReceiver receiver = session.createReceiver( nomJNDIQueue ) ; connection.start(); Message m = receiver.receive(); } }

QueueConnection connection = factory.createQueueConnection() ; QueueReceiver receiver = session.createReceiver( nomJNDIQueue ) ; receiver.setMessageListener( new Listener() ) ; connection.start();
Benot Charroux - API - Mars 02 - 17 Benot Charroux - API - Mars 02 - 18