JMS Cours
JMS Cours
JMS Cours
Patrice Torguet
[email protected]
Universit Paul Sabatier
Plan du cours
l
l
l
l
l
l
l
l
Introduction JMS
l
l
Introduction JMS
App 1
App 2
App 3
API JMS
10
App C
Introduction JMS
l
11
Introduction JMS
l
12
Introduction JMS
l
Hirarchie de classes/interfaces
13
Introduction JMS
l
14
ActiveMQ de Apache
OpenJMS de The OpenJMS Group
JBoss Messaging de JBoss
JORAM de Objectweb
Weblogic de BEA
Oracle AQ
SAP NetWeaver WebAS Java JMS de SAP AG
SonicMQ de Progress Software
Sun Java System Message Queue
Introduction JMS
l
15
TIBCO Software
webMethods Broker Server de webMethods
WebSphere Application Server dIBM
WebSphere MQ dIBM (appel prcdemment
MQSeries)
16
17
Connexions et Sessions
l
l
18
Connexions et Sessions
l
Code :
Context contexte = null;
Connection connexion = null;
String factoryName = "ConnectionFactory";
Session session = null;
// note ce code peut gnrer des NamingException et JMSException
// cration du contexte JNDI.
contexte = new InitialContext();
// rcupration de la ConnectionFactory
ConnectionFactory cf = (ConnectionFactory) contexte.lookup(factoryName);
// cration de la connexion
connexion = cf.createConnection();
// avec login : connexion = cf.createConnection("login", "pass");
19
Destinations, producteurs et
consommateurs
l
20
Destinations, producteurs et
consommateurs
l
21
Producteur Anonyme
l
22
Destinations, producteurs et
consommateurs
l
Code :
...
MessageProducer mp = null;
MessageConsumer mc = null;
// rcupration de la Destination
Destination dest = (Destination) contexte.lookup(FileProduction);
// cration du producteur
mp = session.createProducer(dest);
// rcupration de la Destination
Destination dest = (Destination) contexte.lookup(FileConsommation);
// cration du consommateur
mc = session.createConsumer(dest);
// dmarre la connexion (il faut le faire pour pouvoir recevoir)
connexion.start();
...
23
Destinations, producteurs et
consommateurs
l
24
Destinations, producteurs et
consommateurs
l
25
Destinations, producteurs et
consommateurs
l
26
Destinations, producteurs et
consommateurs
l
Code :
// cration du browser
QueueBrowser browser = session.createBrowser(queue);
// dmarrage de la connexion
connection.start();
// consultation des messages prsents
Enumeration messages = browser.getEnumeration();
while (messages.hasMoreElements()) {
Message message = (Message) messages.nextElement();
}
// cration de labonn persistant (
TopicSubscriber subscriber = session.createDurableSubscriber(topic, nomAboPersist);
// dmarre la connexion. Si labonn existait dj on va recevoir les messages
// en attente ds ce moment
connection.start();
while(true) {
Message message = subscriber.receive();
}
27
Schma rcapitulatif
28
29
Les Messages
l
Il y a 5 sous-types de messages :
30
texte (TextMessage)
associations noms-donnes (MapMessage)
flot de donnes (StreamMessage)
flot de donnes binaires (BytesMessage)
objet (ObjectMessage)
Les Messages
l
31
Les Messages
l
l
l
l
32
Les Messages
l
33
Les Messages
l
l
l
34
Les Messages
l
Code :
// cration dun consommateur avec slecteur
mc = session.createConsumer(dest, JMSType IN (un, deux, trois));
// on ne recevra que des messages dun de ces 3 types
Message m = mc.receive();
35
Les Messages
l
36
Les Messages
l
37
Les Messages
l
38
Les Messages
l
Mthodes utilitaires :
39
Les Messages
l
40
Les Messages
l
41
Mcanisme de Requte/Rponse
l
Outils :
Fonctionnement :
42
Entte JMSReplyTo
Files temporaires (cres avec la mthode
createTemporaryQueue de Session)
Lapplication 1, cre une file temporaire, cre un message
requte, y indique la file temporaire en JMSreplyTo et
produit le message ;
Lapplication 2, rcupre le message, le traite, cre la
rponse, utilise la session pour crer un producteur sur la
file temporaire (getJMSReplyTo) et utilise ce producteur
pour envoyer la rponse.
Mcanisme de Requte/Rponse
App 1
Tempo 1
File
App 3
43
Tempo 2
App 2
Mcanisme de Requte/Rponse
App 1
Tempo 1
File
App 3
44
Tempo 2
App 2
Mcanisme de Requte/Rponse
App 1
Tempo 1
File
App 3
45
Tempo 2
App 2
Mcanisme de Requte/Rponse
App 1
Tempo 1
File
App 3
46
Tempo 2
App 2
Mcanisme de Requte/Rponse
App 1
Tempo 1
File
App 3
47
Tempo 2
App 2
Mcanisme de Requte/Rponse
App 1
Tempo 1
File
App 3
48
Tempo 2
App 2
Mcanisme de Requte/Rponse
App 1
Tempo 1
Sujet
App 2
App 3
49
Mcanisme de Requte/Rponse
App 1
Tempo 1
Sujet
App 2
App 3
50
Mcanisme de Requte/Rponse
App 1
Tempo 1
Sujet
App 2
App 3
51
Mcanisme de Requte/Rponse
App 1
Tempo 1
Sujet
App 2
App 3
52
Mcanisme de Requte/Rponse
App 1
Tempo 1
Sujet
App 2
App 3
53
Mcanisme de Requte/Rponse
App 1
Tempo 1
Sujet
App 2
App 3
54
2 types de transactions :
55
Ensuite on utilisera :
session.commit();
session.rollback();
56
l
l
57
p.send(m1); m1
p.send(m2);
s.commit() m2
m1 = c.receive();
s.rollback();
File
m2 = c.receive();
m1 = c.receive();
s.commit();
58
p.send(m1);
p.send(m2);
s.commit()
m1 = c.receive();
s.rollback();
m1
m2File
m2 = c.receive();
m1 = c.receive();
s.commit();
59
p.send(m1);
p.send(m2);
s.commit()
m1m1 = c.receive();
s.rollback();
m2File
m2 = c.receive();
m1 = c.receive();
s.commit();
60
p.send(m1);
p.send(m2);
s.commit()
m1m1 = c.receive();
s.rollback();
File
m2
m2 = c.receive();
m1 = c.receive();
s.commit();
61
p.send(m1);
p.send(m2);
s.commit()
m1 = c.receive();
s.rollback();
File
m1
m2
m2 = c.receive();
m1 = c.receive();
s.commit();
62
p.send(m1);
p.send(m2);
s.commit()
m1 = c.receive();
s.rollback();
File
m2
m2 = c.receive();
m1 = c.receive();
m1
s.commit();
63
Fiabilit de JMS
l
64
Fiabilit de JMS
l
65
Recevoir un message
Le traiter
Acquitter le message
Fiabilit de JMS
l
66
Session s = c.createSession(false,
Session.CLIENT_ACKNOWLEDGE);
Message m = c.receive(); // rception du message
...
// traitement du message
m.acknowledge();
// acquittement du message
Fiabilit de JMS
l
67
Fiabilit de JMS
l
68
Fiabilit de JMS
l
69
Fiabilit de JMS
l
70
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
producer.send(message, DeliveryMode.NON_PERSISTENT, 3,
10000);
NB : les 3mes et 4mes paramtres sont la priorit et
lexpiration
Fiabilit de JMS
l
71
producer.setPriority(7);
Fiabilit de JMS
l
72
Exemple complet
l
73
destName = args[0];
if (args.length == 2) {
count = Integer.parseInt(args[1]);
}
Exemple complet
try {
// cration du contexte JNDI.
context = new InitialContext();
// recherche de la ConnectionFactory
factory = (ConnectionFactory) context.lookup(factoryName);
// recherche de la Destination
dest = (Destination) context.lookup(destName);
// cration de la connexion
connection = factory.createConnection();
// cration de la session avec transaction
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
// cration du producteur
sender = session.createProducer(dest);
// dmarrage de la connexion (optionnel ici)
connection.start();
74
Exemple complet
try {
75
Exemple complet
} finally {
// fermeture du contexte
if (context != null) {
try {
context.close();
} catch (NamingException exception) {
exception.printStackTrace();
}
}
// fermeture de la connexion
if (connection != null) {
try {
connection.close();
} catch (JMSException exception) {
exception.printStackTrace();
}
}
}
}
76
Exemple complet
l
77
Exemple complet
l
78
Exemple complet
try {
// cre le contexte JNDI
context = new InitialContext();
// cherche la ConnectionFactory
factory = (ConnectionFactory) context.lookup(factoryName);
// cherche la Desination
dest = (Destination) context.lookup(destName);
// cration de la connexion
connection = factory.createConnection();
// cration de la session
session = connection.createSession(
false, Session.AUTO_ACKNOWLEDGE);
// cration du rcepteur
receiver = session.createConsumer(dest);
79
// abonne un listener
receiver.setMessageListener(new SampleListener());
Exemple complet
80
Exemple complet
} finally {
// ferme le contexte
if (context != null) {
try {
context.close();
} catch (NamingException exception) {
exception.printStackTrace();
}
}
// ferme la connexion
if (connection != null) {
try {
connection.close();
} catch (JMSException exception) {
exception.printStackTrace();
}
}
}
}
81
Remerciements et Questions ?
l
82