|
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 |
Cette fiche contient l’ensemble des étapes permettant de communiquer à travers l’API JMS en mode publieur/lecteurs.

Admin admin = new Admin(); |
Remarque : Il est possible d’indiquer un URL sous la forme joram://hostname:port/
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.
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.
// 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 ); |
// 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 ); |
// 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.
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();
}
}
|