aspx:在Active MQ消息上设置消息选择器

时间:2016-11-21 12:49:45

标签: asp.net activemq selector

我有一个简单的测试网站,用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队列上创建消息时,如何在消息中添加选择器值?

提前致谢: - )

2 个答案:

答案 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'" (不要忘记')意味着消费者只从队列中获取使用上面显示的选择器发送的消息。

请注意: 上面的代码很可能不是"最佳做法"或尽可能快速和紧凑。这就是我设法让我的代码工作的方式。

希望这可以帮助有同样问题的人。

随意评论: - )