TP JMS

Conception de logiciels Intranet : patrons et canevas

Moderators: douinj, graffiop

Post Reply
valen_f3
Posts: 28
Joined: 30 Sep 2020 10:46

TP JMS

Post by valen_f3 » 12 Apr 2021 14:45

Bonjour,

J'ai essayé de filter les rendez-vous de l'agenda avec un filtre de type SQL dans openJMS :

Code: Select all

session.createDurableSubscriber(topic, identifier, "motif LIKE '%nonurgent%'",true);
Malgré le filtre "nonurgent" sur la propriété motif de l'objet agenda, le listenner continu malgré tout a recevoir le message contenant "urgent"...

Quelqu'un a réussi à faire tourner un exemple de filter de son coté ?

Merci d'avance,
Fabien V.

cheva_m23
Posts: 8
Joined: 11 Oct 2019 18:32

Re: TP JMS

Post by cheva_m23 » 17 Apr 2021 17:43

Bonjour,

Je ne comprends pas ce que tu veux dire lorsque tu évoques "la propriété motif de l'objet agenda": les propriétés que tu peux tester sont liées au message. Tu devrais donc avoir une ligne du genre message.setStringProperty("motif","valeurVoulue"); avant d'envoyer le message.

Même si je n'aurais pas écrit le test comme ça, il me semble correct.

De mon côté, j'ai eu un bug (héritage erroné) qui me conduisait à inscirire deux fois mon souscripteur filtré (souscription "normale" ET souscription "filtrée"), ce qui faisait que la méthode onMessage() était toujours déclenchée (deux fois si message OK et une seule - via le souscripteur normal - si la condition du filtre n'était pas respectée)

J'espère que cela t'aidera.

valen_f3
Posts: 28
Joined: 30 Sep 2020 10:46

Re: TP JMS

Post by valen_f3 » 19 Apr 2021 19:20

Bonjour,

Merci pour ton aide.
Je pense en effet que cela à un lien avec l'héritage de mon coté aussi.
D'ailleurs si je regarde le bout de code donné "à compléter" pour la classe SouscriptionDurable, je me pose la question

Code: Select all

public class SouscriptionDurable extends Souscription implements MessageListener {

    public SouscriptionDurable(String topicName, String identifier) throws NamingException, JMSException {

        super(topicName);
        //A COMPLETER
        
En appellant super(topicName), on se retrouve avec l'instanciation d'un premier souscripteur "session.createSubscriber(topic);" via l'appel au constructeur de la classe mère Souscription non ?

Constructeur Classe Souscription :

Code: Select all

    public Souscription(String topicName) throws NamingException, JMSException {
        Hashtable<String,String> props = new Hashtable<String,String>();
        props.put(Context.INITIAL_CONTEXT_FACTORY, "org.exolab.jms.jndi.InitialContextFactory");
        props.put(Context.PROVIDER_URL, "tcp://localhost:3035/");
        contexte = new InitialContext(props);

        TopicConnectionFactory fabrique = (TopicConnectionFactory) contexte.lookup("JmsTopicConnectionFactory");
        connexion = fabrique.createTopicConnection(); 
        session = connexion.createTopicSession(false,
            Session.AUTO_ACKNOWLEDGE); 
        topic = (Topic) contexte.lookup(topicName);
        sub = session.createSubscriber(topic);
        sub.setMessageListener(this);
        connexion.start();

    }

georg_s4
Posts: 29
Joined: 16 Oct 2020 11:09

Re: TP JMS

Post by georg_s4 » 20 Apr 2021 8:16

Bonjour,
Sur le filtrage, cela fonctionne de mon côté. J'ai en effet fixé une propriété du message avec une des méthodes javax.jms.Message.setXXXProperty(String name, XXX value), XXX pouvant être 'Long', 'Object', 'Short' et 'String'. Ensuite, le filtrage est 'positif'', c'est-à-dire que seuls les messages vérifiant l'expression de filtrage sont reçus. Dans ton exemple, seuls les messages dont la propriété 'motif' contient 'nonurgent' seront reçus.

georg_s4
Posts: 29
Joined: 16 Oct 2020 11:09

Re: TP JMS

Post by georg_s4 » 20 Apr 2021 8:51

Sur la double souscription et le double listener, en effet la construction m'est apparue comme un peu déroutante. Ce que j'ai fait :
Après l'appel de super(), j'inhibe le MessageListener abonné au souscripteur 'sub' (sub.setMessageListener(null);), je crée un un nouveau souscripteur JMS (durable), affecté à l'attribut 'sub' et réabonne l'instance courante SouscriptionDurable à ce souscripteur (sub.setMessageListener(this);).
Je ne sais pas si c'est la meilleure solution, mais elle fonctionne, y compris avec le filtrage des messages.

valen_f3
Posts: 28
Joined: 30 Sep 2020 10:46

Re: TP JMS

Post by valen_f3 » 20 Apr 2021 11:00

Bonjour,

Merci à vous deux.
J'arrive désormais correctement à filtrer les messages.

Post Reply