4

ActiveMQとJavaJMSを使用しています。

キューにあるメッセージの数を数えたい。

1つのアプローチは、ブラウザでメッセージを数えることです。

    Queue queue = (Queue) session.createQueue(subject);
    QueueBrowser queueBrowser = session.createBrowser(queue);
    Enumeration<?> e = queueBrowser.getEnumeration();
    int numMsgs = 0;
    // count number of messages
    while (e.hasMoreElements()) {
    //    Message m = (Message) e.nextElement();
        e.nextElement();
        numMsgs++;
    }

ただし、保留中のリクエストが5000のキューの場合、これは500のみを返します。

別のアプローチはこれです(キュー内のすべてのメッセージを繰り返します):

Message message= consumer.receive(500);
while(message!= null)
    {

        if (message instanceof TextMessage) 
        {
            TextMessage textMessage = (TextMessage) message;
       //     BytesMessage Byte

            System.out.println("Received message '"+ textMessage.getText() + "'");
        }
        if(message!=null)
            Messages_list.add(message);

        message = consumer.receive(1);
    } 

しかし、これはまた、保留中の適切な量のメッセージを提供しません。

キューで待機しているメッセージを自信を持って繰り返し処理するにはどうすればよいですか?

4

2 に答える 2

7

ActiveMQには、ブラウズが実際のメッセージ数を返さないというバグがあります。この場合、ブラウズはメッセージの1ページのみを返します。これは、maxPageSizeプロパティによって設定され、ここに文書化されています:http: //activemq.apache.org/per-destination-policies.html

ActiveMQには現在、この問題に関するバグレポートがあり、https ://issues.apache.org/jira/browse/AMQ-4181で追跡されています。この問題は解決されており、現在ActiveMQ5.8.0で修正される予定です。

于 2012-12-03T16:33:43.197 に答える
1

ActiveMQを使用しているため、ActiveMQのStatisticsPluginを利用できます:http://activemq.apache.org/statisticsplugin.html

同様に、宛先の統計を照会するには、ActiveMQ.Statistics.Destinationが前に付いた宛先名にメッセージを送信するだけです。たとえば、名前がTEST.FOOのキューの統計を取得するには、ActiveMQ.Statistics.Destination.TEST.FOOという名前のキューに空のメッセージを送信します。

具体的には、に興味があるかもしれませんenqueueCount。プラグインのWebページのサンプルコードは簡潔で優れているため、ここではサンプルコードを省略しています。

于 2012-12-03T13:42:00.093 に答える