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.