我正在使用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方法,但它没有。
答案 0 :(得分:0)
好的,所以这就是最终发生的事情(如果它发生在其他人身上)
Spring.NET使用Apache.NMS.ActiveMQ.MessagePropertyHelper类来处理添加属性。
我不知道,有一些反思,那里有一些反思。在我测试我的小应用程序的某个地方,我厌倦了输入属性名称“MessageType”,所以我只是将它缩短为“Type”。
我无法弄清楚它出错的地方,但显然Type是一个保留字,只是不起作用,也没有任何异常。