【问题标题】:Reading ActiveMQ messages without deletion读取 ActiveMQ 消息而不删除
【发布时间】:2011-12-25 10:32:58
【问题描述】:

我正在尝试通读 ActiveMQ 消息并根据一些过滤器来处理其中一些消息或将其他消息留在队列中。 我使用带有以下代码的 NMS API:

        Uri connecturi = new Uri("activemq:tcp://model.net:61616");
        IConnectionFactory factory = new NMSConnectionFactory(connecturi);
        List<ModelBuilderBase> result = new List<ModelBuilderBase>();
        using (IConnection connection = factory.CreateConnection())
        using (ISession session = connection.CreateSession())
        {
            IDestination destination = SessionUtil.GetDestination(session, "queue://cidModelbuilderQ");
            using (IMessageConsumer consumer = session.CreateConsumer(destination))
            {
                connection.Start();
                ITextMessage message;
                while ((message = consumer.ReceiveNoWait() as ITextMessage) != null)
                {
                    if (message.Properties[MANDATOR] == null || message.Properties[REFCODE] == null)
                        continue;
                    var mandator = message.Properties[MANDATOR].ToString();
                    var refCode = message.Properties[REFCODE].ToString();
                    result.Add(ModelBuilderFactory.Instance.GetInstance(refCode, mandator));
                }
            }

问题是收到消息后,消息被删除。我可以以某种方式更改此行为并仅在成功处理后手动删除消息吗? }

【问题讨论】:

    标签: c# activemq nms


    【解决方案1】:

    虽然为此编写工作代码并不容易,但感谢 ARS 的回答,我现在有了这个工作解决方案:

            Uri connecturi = new Uri("activemq:tcp://model.net:61616");
            IConnectionFactory factory = new NMSConnectionFactory(connecturi);
            List<ModelBuilderBase> result = new List<ModelBuilderBase>();
            using (IConnection connection = factory.CreateConnection())
            using (ISession session = connection.CreateSession())
            {
    
                IDestination destination = SessionUtil.GetDestination(session, "queue://cidModelbuilderQ");
                using (IMessageConsumer consumer = session.CreateConsumer(destination))
                {
                    connection.Start();
                    var q = session.GetQueue("cidModelbuilderQ");
                    var b = session.CreateBrowser(q);
                    var msgs = b.GetEnumerator();
                    while (msgs.MoveNext())
                    {
                        ITextMessage message = msgs.Current as ITextMessage;
                        if (message.Properties[MANDATOR] == null || message.Properties[REFCODE] == null)
                            continue;
                        var mandator = message.Properties[MANDATOR].ToString();
                        var refCode = message.Properties[REFCODE].ToString();
                        result.Add(ModelBuilderFactory.Instance.GetInstance(refCode, mandator));
                    }
                }
            }
    

    【讨论】:

      【解决方案2】:

      创建一个 QueueBrowser 对象以查看指定队列上的消息。对消息执行逻辑,然后创建一个 QueueReceiver 对象来接收来自指定队列的消息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-24
        • 2021-04-02
        • 2017-07-05
        • 2012-07-09
        • 1970-01-01
        • 2012-12-06
        • 2013-09-30
        • 1970-01-01
        相关资源
        最近更新 更多