QueueBrowser不会返回所有消息

时间:2012-11-15 09:26:26

标签: java jms activemq message-queue

我列出了每个队列中的队列和消息。以下是我的代码。但是,QueueBrowser无法正确检索消息。

假设我有一个名为TestQueue的队列,它有1000条消息。

我第一次运行程序时只显示200条消息。 第二 - 400 第三 - 600 四 - 800 第五 - 1000

你能告诉我如何解决这个问题吗?

ConnectionFactory out = new ActiveMQConnectionFactory("tcp://localhost:61616?jms.prefetchPolicy.all=10000");
ActiveMQConnection connection = (ActiveMQConnection) out.createConnection();

connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

Set<ActiveMQQueue> amqs = connection.getDestinationSource().getQueues(); 
Iterator<ActiveMQQueue> queues = amqs.iterator(); 

while ( queues.hasNext() ) 
{ 
    ActiveMQQueue queue_t = aqueues.next(); 
    String q_name = queue_t.getPhysicalName();
    List<ActiveMQMessage> msgList = ((ActiveMQSession) session).getUnconsumedMessages();

    System.out.println( "\nQueue = " + q_name);

    QueueBrowser queueBrowser = session.createBrowser(queue_t);
    Enumeration e = queueBrowser.getEnumeration();

    int numMsgs = 0;
    while(e.hasMoreElements()) 
    {
         Message message = (Message) e.nextElement();
         numMsgs++;
    }
    System.out.println("No of messages = " + numMsgs);
    queueBrowser.close();
}                    
session.close();
connection.close();

2 个答案:

答案 0 :(得分:3)

来自javax.jms.QueueBrowser API:

  

扫描完成后,消息可能会到达并过期。 JMS API不要求枚举的内容是队列内容的静态快照。这些更改是否可见取决于JMS提供程序。

您是否尝试过指定prefetch policy

答案 1 :(得分:0)

只需使用JMX连接到Broker(例如使用jconsole)。在特定队列集MaxPageSize属性超过200时,您可以列出更多消息。