【问题标题】:aspx: Setting message selector on Active MQ messageaspx:在 Active MQ 消息上设置消息选择器
【发布时间】:2017-04-04 21:00:06
【问题描述】:

我有一个简单的测试网站,用 ASP.NET (C#) 编写,我可以从该网站向本地主机上的 Active MQ 队列发送消息,并从本地主机上的队列接收消息。我的问题有两个方面:

1) 如何从我的网站向包含特定 Selector 值的队列发送消息?

目前,我创建了要发送到队列的消息,如下所示:

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 队列上创建消息时,如何将选择器值添加到消息中?

提前致谢:-)

【问题讨论】:

    标签: asp.net activemq selector


    【解决方案1】:

    消息选择器是消费者(订阅)过滤他们在活动时收到的消息的一种方式。在发送消息时,您没有设置或使用选择器做任何事情。如果您发送到队列并且消费者有一个与消息匹配的选择器,那么它将被分派给它,否则消息将保留在队列中,直到另一个消费者读取并确认它。一些文档是here

    在 Google 上搜索 JMS 消息选择器以了解更多信息。

    【讨论】:

    • 从您引用的链接以及我看过的其他链接中,您必须将消费者选择器作为键/值对提供。我遇到的困难是将这个键/值对放在消息中的哪个位置。谁能告诉我选择器键/值对应放置在消息中的何处以及如何放置?
    • 您的原始问题并未反映您现在的问题,我会更新问题以使其清楚。
    • 如果我的问题一开始就不清楚,我深表歉意。感谢您抽出宝贵时间使其更清楚。
    【解决方案2】:

    我设法弄清楚了,并认为我会在这里分享我的发现供其他人查看/评论。

    首先我创建了一个 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();
    

    设置“string Selector = “deviceID = '12345'”(不要忘记'')意味着消费者只从队列中获取使用上面显示的选择器发送的消息。

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

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

    欢迎评论:-)

    【讨论】:

      猜你喜欢
      • 2015-11-05
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多