2009-07-09 11 views
0

J'utilise Spring.NET pour me connecter à ActiveMQ et effectuer un sous-routage pub assez simple. Tout fonctionne bien quand mon sélecteur est une expression simple comme Car = 'Honda' mais si j'essaie une expression composée comme Car = 'Honda' ET Make = 'Pilot' je ne trouve jamais de correspondance sur mon abonnement.Spring.Net Les sélecteurs de message avec des instructions composées ne semblent pas fonctionner

Voici le code pour générer l'abonnement, est-ce que quelqu'un voit où je pourrais faire quelque chose de mal?

public bool AddSubscription(string topicName, Dictionary<string,string> selectorList, GDException exp) 
     { 
      try 
      { 
       ActiveMQTopic topic = new ActiveMQTopic(topicName); 
       string selectorString = ""; 

       if (selectorList.Keys.Count == 0) 
       { 
        // Select all items for this topic 
        selectorString = "2>1"; 
       } 
       else 
       { 
        foreach (string key in selectorList.Keys) 
        { 
         selectorString += key + " = '" + selectorList[key] + "'" + " AND "; 
        } 
        selectorString = selectorString.Remove(selectorString.Length - 5, 5); 
       } 

       IMessageConsumer consumer = this._subSession.CreateConsumer(topic, selectorString, false); 
       if (consumer != null) 
       { 
        _consumers.Add(consumer); 
        consumer.Listener += new MessageListener(HandleRecieveMessage); 
        return true; 
       } 
       else 
       { 
        exp.SetValues("Error adding subscription, null consumer returned"); 
        return false; 
       } 
      } 
      catch (Exception ex) 
      { 
       exp.SetValues(ex); 
       return false; 
      } 
     } 

Et puis le code pour envoyer le message, ce qui me semble assez simple à

public void SendMessage(GDPubSubMessage messageToSend) 
     { 
      if (!this.isDisposed) 
      { 
       if (_producers.ContainsKey(messageToSend.Topic)) 
       { 
        IBytesMessage bytesMessage = this._pubSession.CreateBytesMessage(messageToSend.Payload); 
        foreach (string key in messageToSend.MessageProperties.Keys) 
        { 
         bytesMessage.Properties.SetString(key, messageToSend.MessageProperties[key]); 
        } 

        _producers[messageToSend.Topic].Send(bytesMessage, false, (byte)255, TimeSpan.FromSeconds(1)); 
       } 
       else 
       { 
        ActiveMQTopic topic = new ActiveMQTopic(messageToSend.Topic); 
        _producers.Add(messageToSend.Topic, this._pubSession.CreateProducer(topic)); 
        IBytesMessage bytesMessage = this._pubSession.CreateBytesMessage(messageToSend.Payload); 
        foreach (string key in messageToSend.MessageProperties.Keys) 
        { 
         bytesMessage.Properties.SetString(key, messageToSend.MessageProperties[key]); 
        } 

        _producers[messageToSend.Topic].Send(bytesMessage); 
       } 
      } 
      else 
      { 
       throw new ObjectDisposedException(this.GetType().FullName); 
      } 
     } 

07/102009: Mise à jour

Ok, a trouvé le problème

bytesMessage.Properties.SetString(key, messageToSend.MessageProperties[key]); 

Ce justs définit une seule propriété, donc mes messages ne sont marqués qu'avec une seule propriété, d'où le sous-ensemble La scription n'est jamais touchée. Quelqu'un sait comment ajouter plus de propriétés? Vous penseriez que bytesMessage.Properties aurait une méthode Add, mais ce n'est pas le cas.

Répondre

0

Ok, donc voici ce qui a fini par se produire (si jamais arriver à quelqu'un d'autre)

Spring.NET utilise la classe Apache.NMS.ActiveMQ.MessagePropertyHelper pour gérer les propriétés d'ajouter.

Inconnu à moi, il y a une réflexion en cours il y a une réflexion en cours là-dedans. Quelque part pendant mes tests de ma petite application, j'en ai eu marre de taper le nom de propriété "MessageType", donc je l'ai juste raccourci à "Type".

Je n'arrive pas à comprendre où ça se passe, mais clairement, Type est un mot réservé qui ne fonctionne pas et ne génère aucune exception.