Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

QueueBrowser does not return all messages

I list down queues and messages from each queue. The following is my code. But, QueueBrowser does not retrieve messages correctly.

Let's say, I have a queue named TestQueue which has 1000 message.

first time i run my program it shows only 200 messages. second - 400 third - 600 forth - 800 fifth - 1000

Can you tell me how to fix this problem?

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();
like image 242
Lwin Htoo Ko Avatar asked Nov 15 '12 09:11

Lwin Htoo Ko


1 Answers

From the javax.jms.QueueBrowser API:

Messages may be arriving and expiring while the scan is done. The JMS API does not require the content of an enumeration to be a static snapshot of queue content. Whether these changes are visible or not depends on the JMS provider.

Have you tried specifying the prefetch policy?

like image 186
MaDa Avatar answered Sep 25 '22 10:09

MaDa