我有一个简单的测试网站,用ASP.NET(C#)编写,我可以从中发送消息到本地主机上的Active MQ队列,并从本地主机上的队列接收消息。我的问题是双重的:
1)如何从我的网站向包含特定选择器值的队列发送消息?
目前我创建的消息是我发送到这样的队列:
IConnectionFactory factory = new NMSConnectionFactory("tcp://192.168.1.152:61616");
IConnection connection = factory.CreateConnection();
connection.Start();
ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
IDestination QueueDestination = SessionUtil.GetDestination(session, "Request");
IMessageProducer messageProducer = session.CreateProducer(QueueDestination);
ITextMessage request = session.CreateTextMessage(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ": " + tb_Request.Text.Trim());
messageProducer.Send(request);
2)在我的本地主机ActiveMQ队列上创建消息时,如何在消息中添加选择器值?
提前致谢: - )
答案 0 :(得分:0)
消息选择器是消费者(订阅)过滤活动时收到的消息的一种方式。在发送消息时,您不会使用选择器设置或执行任何操作。如果您发送到队列并且消费者有一个与消息匹配的选择器,那么它将被分派给它,否则消息将保留在队列中,直到另一个消费者读取并确认它。有些文档是here。
在Google上搜索JMS消息选择器以了解更多信息。
答案 1 :(得分:0)
我设法弄清楚了,并且认为我会在这里分享我的发现,供其他人查看/评论。
首先我创建了一个OperatorRequestObject类:
public class OperatorRequestObject
{
string shortcode;
public string Shortcode {
get { return shortcode; }
set { shortcode = value; }
}
}
创建要发送到队列的消息时,我使用了以下代码:
OperatorRequestObject OperatorRequestObject = new OperatorRequestObject();
OperatorRequestObject.Shortcode = tb_Request.Text.ToString();
IConnectionFactory factory = new NMSConnectionFactory("tcp://192.XXX.X.XXX:61616");
IConnection connection = factory.CreateConnection();
connection.Start();
ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
IDestination QueueDestination = SessionUtil.GetDestination(session, "Command");
IMessageProducer messageProducer = session.CreateProducer(QueueDestination);
ITextMessage request = session.CreateTextMessage(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ": " + tb_Request.Text.Trim());
request.Properties.SetString("deviceID", "12345");
messageProducer.Send(request);
session.Close();
connection.Stop();
tb_Request.Text = "";
tb_Request.Focus();
行" request.Properties.SetString(" deviceID"," 12345");"是我添加我的选择键/值对的地方,我用它来选择哪个消费者得到什么消息。
根据" deviceID"的值检索邮件。我使用这段代码:
string Selector = "deviceID = '12345'";
IConnectionFactory factory = new NMSConnectionFactory("tcp://192.XXX.X.XXX:61616");
IConnection connection = factory.CreateConnection();
connection.Start();
ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
IDestination destination = SessionUtil.GetDestination(session, "Command");
IMessageConsumer messageConsumer = session.CreateConsumer(destination, Selector);
IMessage message = messageConsumer.Receive();
string NewCommand = "";
if (message != null) {
ITextMessage IText = message as ITextMessage;
if (IText != null) {
if (!string.IsNullOrEmpty(IText.Text)) {
NewCommand = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ": " + IText.Text;
}
}
}
tb_Command.Text = tb_Command.Text + "\r\n" + NewCommand;
messageConsumer.Close();
messageConsumer.Dispose();
connection.Stop();
connection.Close();
connection.Dispose();
设置"字符串选择器=" deviceID =' 12345'" (不要忘记')意味着消费者只从队列中获取使用上面显示的选择器发送的消息。
请注意: 上面的代码很可能不是"最佳做法"或尽可能快速和紧凑。这就是我设法让我的代码工作的方式。
希望这可以帮助有同样问题的人。
随意评论: - )