具有复合语句的Spring.Net消息选择器似乎不起作用

时间:2009-07-09 21:13:56

标签: spring.net

我正在使用Spring.NET连接到ActiveMQ并做一些相当简单的pub子路由。当我的选择器是一个像Car ='Honda'这样的简单表达式时,一切正常,但是如果我尝试像Car ='Honda'和Make ='Pilot'这样的复合表达式,我的订阅永远不会得到任何匹配。

以下是生成订阅的代码,是否有人知道我可能在哪里做错了什么?

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

然后发送消息的代码,这对我来说似乎很简单

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:更新

好的,发现了问题

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

这只是设置了一个属性,因此我的消息只被标记为单个属性,因此组合订阅永远不会被命中。有谁知道如何添加更多属性?你认为bytesMessage.Properties会有一个Add方法,但它没有。

1 个答案:

答案 0 :(得分:0)

好的,所以这就是最终发生的事情(如果它发生在其他人身上)

Spring.NET使用Apache.NMS.ActiveMQ.MessagePropertyHelper类来处理添加属性。

我不知道,有一些反思,那里有一些反思。在我测试我的小应用程序的某个地方,我厌倦了输入属性名称“MessageType”,所以我只是将它缩短为“Type”。

我无法弄清楚它出错的地方,但显然Type是一个保留字,只是不起作用,也没有任何异常。