Professional Documents
Culture Documents
Annick Fron
fron@essi.fr
Http://www.afceurope.com
Printemps 2004
Printemps 2004
Printemps 2004
Le filtrage de messages
Printemps 2004
Filtrage de messages
Filtre
Prop = 'blue'
Printemps 2004
Prop = 'green'
Prop = 'yellow'
Ct rcepteur
queueReceiver = session.createReceiver(ioQueue,
"myProp = 'blue'");
Qualit de service
Printemps 2004
Qualit de service
IBM Websphere MQ
Joram
OpenJMS
SonicMQ
SwiftMQ
Etc
Printemps 2004
10
Entte
JMSDestination, JMSDeliveryMode, JMSMessageId,
JMSExpiration, JMSPriority, etc.
Proprits
Couple <nom, valeur>
Corps
TextMessage, MapMessage
StreamMessage, ObjectMessage
BytesMessage
Printemps 2004
11
Dfini par
send ou publish method
send ou publish method
send ou publish method
send ou publish method
send ou publish method
send ou publish method
Client
Client
Client
JMS provider
Annick Fron JMS 2me partie
12
Printemps 2004
13
Message
Producer
send
send
Printemps 2004
Message
Message
14
2 interfaces d'envoi
sender.send(message),
send(Message message, int deliveryMode, int
priority, long timeToLive)
Idem publisher.publish(message)
Idem avec JMS 1.1 unifi : producer.send(...)
Printemps 2004
15
Les priorits
producer.send(message,
DeliveryMode.NON_PERSISTENT, 3, 10000);
16
2 valeurs possibles :
DeliveryMode.NON_PERSISTENT (rare)
DeliveryMode.PERSISTENT (dfaut)
Message
Message.setJMSDeliveryMode(DeliveryMode.PERSISTENT)
MessageProducer
producer.setDeliveryMode(...)
Printemps 2004
17
Nota
Le mode de persistance est la discrtion du serveur
de messages.
Si le serveur tombe, les messages non persistants
sont perdus, les autres sont renvoys lors de la
restauration du serveur
Smantique "one only"
"A message is guaranteed to be delivered once and only
once by a JMS provider if the delivery mode of the
message is PERSISTENT and if the destination has a
sufficient message retention policy."
Printemps 2004
18
Exprime en ms
0 : le message n'expire jamais, 10000 au bout de 10s
(10000 ms) : par dfaut n'expire jamais
4 me argument du send
topicPublisher.publish(message,
DeliveryMode.NON_PERSISTENT, 3, 10000)
Message
Message.setJMSExpiration(10000)
Printemps 2004
19
Question
Printemps 2004
20
DurableSubscribers
Printemps 2004
21
Publish/subscribe
Printemps 2004
22
M3 - M4 pas reus !
Printemps 2004
23
24
Printemps 2004
25
Scnario
Printemps 2004
26
Printemps 2004
27
Suppression de l'abonnement
topicSession.unsubscribe("monAbonnement");
Printemps 2004
28
Question
Printemps 2004
29
Printemps 2004
30
Printemps 2004
31
Accuss de rception
Printemps 2004
32
Printemps 2004
33
En JMS
Printemps 2004
34
Printemps 2004
35
36
Acknowledge
queueConnection.createQueueSession(
transacted,
Session.AUTO_ACKNOWLEDGE)
Printemps 2004
37
Question
Printemps 2004
38
Rappels Session
receive
session
receive
send
send
Printemps 2004
39
Session
Session
Session
Connexion
Printemps 2004
40
Acknowledge
Printemps 2004
41
Printemps 2004
42
Session.AUTO_ACKNOWLEDGE :
Envoy ds que le rcepteur termine onMessage en
asynchrone, receive en synchrone
Session.CLIENT_ACKNOWLEDGE
L'acknowledge est global au niveau de la session (pour tous
les messages jusqu' prsent) et dclench explicitement
ct rception par :
message.acknowledge()
Printemps 2004
43
Printemps 2004
44
Tu accapares
la bande
passante !
Que fais-tu ? Je viens
d'envoyer 50
messages
DUPS_OK
Paresseux si tu veux,
Tu m'obliges envoyer
mais n'importe
les messages plusieurs
si je reois 2 fois
fois !
Printemps 2004
45
Rgles de retrait
Printemps 2004
46
Printemps 2004
47
Printemps 2004
48
Printemps 2004
49
Printemps 2004
50
Printemps 2004
51
Printemps 2004
52
Emet/rcept B
1
2
3
4
5
Printemps 2004
53
Destinations temporaires
message.setJMSReplyTo(session.createTemporaryQueue())
Ct client
producer = session.createProducer(msg.getJMSReplyTo());
replyMsg = session.createTextMessage("Consumer " +
"processed message: " + msg.getText());
replyMsg.setJMSCorrelationID(msg.getJMSMessageID());
producer.send(replyMsg);
rcepteur
Printemps 2004
55
QueueRequestor
Il existe un framework plus systmatique :
QueueRequestor
Le QueueRequestor utilise 2 principes :
la destination de rponse (TemporaryQueue dfinie
dans getJMSReplyTo())
une corrlation d'ID (rappelez-vous du header !)
getJMSCorrelationID()
Printemps 2004
56
QueueRequestor : ct envoyeur
Ceci remplace :
sender.send(message)
Printemps 2004
57
QueueRequestor : ct rcepteur
Printemps 2004
58
QueueReceptor(3) : retour
l'envoyeur
Printemps 2004
59
Printemps 2004
60
Les transactions
Printemps 2004
61
Ct rcepteur
Les messages reus ne sont pas acquitts avant "commit"
Les messages reus sont relivrs lors de "rollback"
Printemps 2004
62
Les transactions
connexion.createQueueSession(true,
Session.AUTO_ACKNOWLEDGE)
On peut alors utiliser :
queueSession.commit();
queueSession.rollback();
Printemps 2004
63
Transaction
transaction2
Commit/rollback
Il est trs difficile de grer des transactions gigognes
(nested transactions)
Printemps 2004
64
Transactions locales
Printemps 2004
65
Transactions (suite)
66
Transactions (suite)
Printemps 2004
67
send
Service achats
livraison
transaction
session.createReceiver( commande );
receiver.receive();
session.createSender( livraison )
sender.send(...)
session.commit()
Printemps 2004
68
2 phases commit
Printemps 2004
69
Transactions : rsum
Une session JMS peut tre transactionnelle
connexion.createQueueSession(true, 0)
commit et rollback concernent l'ensemble des
messages de la session
Souvent utilis en workflow
Il existe des extensions JTA/XA
(XAQueueConnexionFactory) pour le 2-phase commit
(Java Transaction API) y compris avec des BD
Printemps 2004
70
Conclusions
Printemps 2004
71
Rfrences
http://www.hartmannsoftware.com/JMS_Tutorial.pdf
http://www-106.ibm.com/developerworks/java/library/j-jms
http://java.sun.com/products/jms/tutorial/
Printemps 2004
72