Fiches / Articles

Cadre Fonctionnel

Développement Système de messagerie

Cadre Technique

NT / JMS (Java Message Service), Joram

Identifiant 

DEV_JMS_01

Référent technique 


Version 

1.0

Auteur 

Alexandre Brillant

Date 

04/01

Source

Documentation Jonas

Cibles 


Dépendance 

SYS_JMS_01, INS_JMS_01

Cette fiche contient l’ensemble des étapes permettant de communiquer à travers l’API JMS en mode publieur/lecteurs.



1°) Etablir une communication avec Joram

Admin admin = new Admin();

Remarque : Il est possible d’indiquer un URL sous la forme joram://hostname:port/

2°) Création d’un agent de communication


fr.dyade.aaa.joram.XATopicConnectionFactory factory =
admin.createXATopicAgentClient();

Remarque : Cet agent gère la création de topic ainsi que la création de session pour la transmission/réception de message.

3°) Création d’un Topic

Un topic est une zone de communication entre un « publieur » et un ensemble de lecteurs. Un topic est stockée grâce à JNDI (Java Naming and Directory Interfaces)


InitialContext context = new InitialContext();

Topic topic = null;

String subject = « topic1 » ;

// Création d'un topic

boolean again = true;

while ( again ) {

try {

     topic = factory.createNewTopic();

     again = false;

     break;

 } catch( Exception e ) {}

}

// Référencer le topic sur JNDI

context.rebind( subject, topic
);	

Remarque : Lors de la création d’un nouveau topic, le serveur Joram peut être occupé ce qui lève une exception. C’est la raison de la boucle while.


4°) Création d’une session


// Connection Joram 

fr.dyade.aaa.joram.TopicConnection tc =
(fr.dyade.aaa.joram.TopicConnection)factory.createTopicConnection();

tc.start();

// Création d'une session sans transaction avec
aquittement 

fr.dyade.aaa.joram.TopicSession session =       
(fr.dyade.aaa.joram.TopicSession)tc.createTopicSession( 

false, Session.AUTO_ACKNOWLEDGE );

5°) Création d’un “publieur”


// Création d'un message de type texte

TextMessage text = session.createTextMessage( message );

// Création d'un agent de transmission du message

fr.dyade.aaa.joram.TopicPublisher tp =
(fr.dyade.aaa.joram.TopicPublisher)session.createPublisher( topic );

 // Emission du message

tp.publish( text );

6°) Création d’un « lecteur »


// Création d'un agent de récèption

fr.dyade.aaa.joram.TopicSubscriber ts =    
  (fr.dyade.aaa.joram.TopicSubscriber)session.createSubscriber( topic );

// Référencer un 'écouteur' de messages

CustomListener listener = new CustomListener();

ts.setMessageListener( listener );

Remarque : CustomListener est une classe implémentant l’interface MessageListener contenant la méthode public void onMessage( Message msg ) contenant le message reçu.


Exemple complet

import javax.naming.*;
import javax.jms.Topic;
import javax.jms.*;

/**
* Agent de transmission et de récèption de messages
* En mode 'publisher' on peut émettre un message
* En mode 'consummer' on peut recevoir un message
* Exécuter une fois le programme en mode 'publisher' puis
* une fois le programme en mode 'consummer'. Appuyez sur
* une touche pour transmettre un message. Le mode 'publisher'
* crée aussi un topic et le référence sur JNDI selon un 
* alias choisit par la ligne de commande.
*/
public class Agent1 {

   static class CustomListener implements MessageListener {
	// Réception d'un message
	public void onMessage( Message msg ) {
	   System.out.println( "Reception d'un message :" + msg.toString() );
	}
   }

   static void usage() {
   System.out.println( "Usage Agent1 [publisher | consummer] [topic] [message?]" );
	System.exit( 1 );
   }

   public static void main( String[] args ) throws Exception {
	if ( args.length < 2 ) {
	   usage();
	}

	String subject = args[ 1 ];
	String message = null;
	boolean isPublisher = "publisher".equals( args[ 0 ] );
	if ( isPublisher && ( args.length < 3 ) ) {
	   usage();
	}
	else
	   if ( isPublisher ) {
		message = args[ 2 ];
	   }

	//Connection avec Joram
	Admin admin = new Admin();
	//Agent de gestion des messages
	fr.dyade.aaa.joram.XATopicConnectionFactory
	factory = admin.createXATopicAgentClient();
	// Acces JNDI
	InitialContext context = new InitialContext();
	Topic topic = null;
	if ( isPublisher ) {
	   // Création d'un topic
	   boolean again = true;

	   while ( again ) {
	     try {
	        topic = factory.createNewTopic();
		again = false;
		break;
	     } catch( Exception e ) {}
     	  }

	  // Référencer le topic sur JNDI
	  context.rebind( subject, topic );
	} else {
	   // Obtenir la référence du topic pour un consommateur
	   topic = ( Topic )context.lookup( subject );
	}

	admin.close();
	fr.dyade.aaa.joram.TopicConnection tc = (fr.dyade.aaa.joram.TopicConnection)factory.createTopicConnection();
	tc.start();
	// Création d'une session sans transaction avec aquittement 

	fr.dyade.aaa.joram.TopicSession session = (fr.dyade.aaa.joram.TopicSession)tc.createTopicSession( false, Session.AUTO_ACKNOWLEDGE );
	if ( isPublisher ) {
	  // Créatian d'un message de type texte
	  TextMessage text = session.createTextMessage( message );

	  // Création d'un agent de transmission du message

	  fr.dyade.aaa.joram.TopicPublisher tp = (fr.dyade.aaa.joram.TopicPublisher)session.createPublisher( topic );
	  int i = 0;
	  
	  while ( true ) {
		// Emission du message
		tp.publish( text );
		System.in.read();
		System.out.println( "Transmission du message :" + i++ );
          }
	} else {
	 // Création d'un agent de récèption
	 fr.dyade.aaa.joram.TopicSubscriber ts =
	   (fr.dyade.aaa.joram.TopicSubscriber)session.createSubscriber( topic );

	 // Référencer un 'écouteur' de messages
	 CustomListener listener = new CustomListener();
	 ts.setMessageListener( listener );
	 System.in.read();
	}	 

	// Fermer la session
	session.close();
	// Fermer la connexion
	tc.close();
   }
}