TP JMS

Conception de logiciels Intranet : patrons et canevas

Modérateurs : douinj, graffiop

valen_f3
Messages : 27
Inscription : 30 sept. 2020 10:46

TP JMS

Message par valen_f3 » 12 avr. 2021 14:45

Bonjour,

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

Code : Tout sélectionner

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
Messages : 8
Inscription : 11 oct. 2019 18:32

Re: TP JMS

Message par cheva_m23 » 17 avr. 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
Messages : 27
Inscription : 30 sept. 2020 10:46

Re: TP JMS

Message par valen_f3 » 19 avr. 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 : Tout sélectionner

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 : Tout sélectionner

    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
Messages : 28
Inscription : 16 oct. 2020 11:09

Re: TP JMS

Message par georg_s4 » 20 avr. 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
Messages : 28
Inscription : 16 oct. 2020 11:09

Re: TP JMS

Message par georg_s4 » 20 avr. 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
Messages : 27
Inscription : 30 sept. 2020 10:46

Re: TP JMS

Message par valen_f3 » 20 avr. 2021 11:00

Bonjour,

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

Répondre