Page 1 sur 1

TP JMS

Publié : 12 avr. 2021 14:45
par valen_f3
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.

Re: TP JMS

Publié : 17 avr. 2021 17:43
par cheva_m23
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.

Re: TP JMS

Publié : 19 avr. 2021 19:20
par valen_f3
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();

    }

Re: TP JMS

Publié : 20 avr. 2021 8:16
par georg_s4
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.

Re: TP JMS

Publié : 20 avr. 2021 8:51
par georg_s4
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.

Re: TP JMS

Publié : 20 avr. 2021 11:00
par valen_f3
Bonjour,

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