QueueBrowser does not return all messages
activemq-classic, java, jms, message-queue
Solution
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?
Problem
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(); ```