Spring.Net Message Selectors with compound statements don't seem to be working

Posted by Jonathan Beerhalter on Stack Overflow See other posts from Stack Overflow or by Jonathan Beerhalter
Published on 2009-07-09T21:13:56Z Indexed on 2010/06/03 7:04 UTC
Read the original article Hit count: 243

Filed under:

I'm using Spring.NET to connect to ActiveMQ and do some fairly simple pub sub routing. Everything works fine when my selector is a simple expression like Car='Honda' but if I try a compound expression like Car='Honda' AND Make='Pilot' I never get any matches on my subscription.

Here's the code to generate the subscription, does anyone see where I might be doing something wrong?

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;
            }
        }

And then the code to send the message, which seems simple enough to me

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: Update

Ok, found the problem

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

This justs sets a single property, so my messages are only being tagged with a single property, hence the combo subscription never gets hit. Anyone know how to add more properties? You'd think bytesMessage.Properties would have a Add method, but it doesn't.

© Stack Overflow or respective owner

Related posts about spring.net