On souhaite dans cet
exercice mettre en pratique certains éléments avancés de l'API JMS.
L'objectif de cet
exercice est d'écrire un producteur de messages envoyant sur un topic des dépêches classées en plusieurs catégories. N
consommateurs de messages vont lire les messages émis sur ce topic. Ces consommateurs ne sont intéressés que par un type
de message. Ils effectueront donc un filtrage sur les messages reçus et ne
retiendront que les messages pertinents.
On se donne les
contraintes suivantes :
Note: il s'agit d'une
hypothèse de déploiement, l'implantation ne doit pas dépendre de cette
hypothèse.
Le squelette du programme à compléter est dans TopicSelectors.java.
Un objet Barrier vous permettra de synchroniser un objet local,
par exemple pour indiquer à un consommateur de messages que son MessageListener a reçu le dernier message.
Dans le cas de la
synchronisation entre producteur et consommateurs, il faut prendre en compte le
caractère potentiellement distribué de l'application.
Les messages émis sur un Topic auquel aucun consommateur n'est abonné seront perdus.
Il faut donc dans l'exemple précédent s'assurer que des consommateurs seront
effectivement présents avant d'émettre. Pour résoudre ce problème, nous allons
utiliser une fille de control (un objet Queue) pour synchroniser producteur et consommateurs de
messages. On se propose d'ajouter les méthodes suivantes à la classe TopicSelectors :
public static void sendSynchronizeMessage(String prefix)
throws Exception { … }
public static void receiveSynchronizeMessages(String prefix, int count) { … }
Ces deux méthodes
utiliseront la file de control (ex : syncQueueName)
pour échanger des messages de synchronisation: le producteur attendra count messages de synchronisation émis
par chacun des consommateurs avant d'émettre ses messages.
§ Modifiez votre code pour permettre la
synchronisation entre MessageListener et consommateur de message, puis entre producteur
de messages et consommateurs.
Pour exécuter le TopicSelectors,
consultez les commandes d’exécution de clients JMS - Commandes > Exécution