使用 C# 和 Apache NMS 的 ActiveMQ - 对队列中的消息进行计数

Posted

技术标签:

【中文标题】使用 C# 和 Apache NMS 的 ActiveMQ - 对队列中的消息进行计数【英文标题】:ActiveMQ with C# and Apache NMS - Count messages in queue 【发布时间】:2011-11-22 15:27:08 【问题描述】:

我正在使用 ActiveMQ 通过 C# 应用程序发送和接收消息。但是,我在获取队列中消息的数量时遇到了一些困难。这是我的代码:

    public int GetMessageCount()
    
        int messageCount = 0;
        Uri connecturi = new Uri(this.ActiveMQUri);

        IConnectionFactory factory = new NMSConnectionFactory(connecturi);

        using (IConnection connection = factory.CreateConnection())
        using (ISession session = connection.CreateSession())
        
            IDestination requestDestination = SessionUtil.GetDestination(session, this.QueueRequestUri);

            IQueueBrowser queueBrowser = session.CreateBrowser((IQueue)requestDestination);
            IEnumerator messages = queueBrowser.GetEnumerator();

            while(messages.MoveNext())
            
                messageCount++;
            

            connection.Close();
            session.Close();
            connection.Close();
        

        return messageCount;
    

我以为我可以使用 QueueBrowser 来获取计数,但它返回的 IEnumerator 始终为空。我从这个页面得到了使用QueueBrowser 的想法,但也许还有另一种方法我应该这样做?

更新:

我在遍历枚举器时发现的“无限循环”问题的解决方案是通过访问当前消息来解决的。它现在只循环一次(这是正确的,因为队列中只有一条消息)。

新的while循环是:

while(messages.MoveNext())

    IMessage message = (IMessage)messages.Current;
    messageCount++;

【问题讨论】:

你能分享一下:这段代码> SessionUtil.GetDestination |请 【参考方案1】:

我现在没有 ActiveMq,所以我无法尝试 但我认为问题是你没有开始连接。试试这样:

using (IConnection connection = factory.CreateConnection())

    connection.start ();

     using (ISession session = connection.CreateSession())
     
      //Whatever...
     


【讨论】:

谢谢,它现在填充了 QueueBrowser 的枚举器,但尽管队列中只有 1 条消息,while(messages.MoveNext()) 现在在看似无限循环中永远运行。从无到有! 我修复了循环问题(如上面更新中所述),尽管我不太确定实际问题是什么。但是,通过启动连接已回答了原始问题,因此感谢您的帮助!

以上是关于使用 C# 和 Apache NMS 的 ActiveMQ - 对队列中的消息进行计数的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMq C#客户端 消息队列的使用(存和取)

使用队列的 C# STOMP 消息传递

activemq artemis关于 Apache.NMS.AMQP 使用注意事项。

ActiveMQ NMS C# 对象消息使用啥序列化方法?

ActiveMQ NMS:当代理关闭时,connection.start() 使用故障转移协议挂起

ActiveMQ 未找到连接的 IConnectionFactory 实现