/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.activemq.artemis.tests.integration.openwire.amq; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.MessageProducer; import javax.jms.QueueBrowser; import javax.jms.Session; import javax.jms.TextMessage; import java.util.Enumeration; import org.apache.activemq.artemis.tests.integration.openwire.BasicOpenWireTest; import org.apache.activemq.command.ActiveMQDestination; import org.apache.activemq.command.ActiveMQQueue; import org.junit.Test; /** * adapted from: org.apache.activemq.JmsQueueBrowserTest */ public class JmsQueueBrowserTest extends BasicOpenWireTest { /** * Tests the queue browser. Browses the messages then the consumer tries to * receive them. The messages should still be in the queue even when it was * browsed. * * @throws Exception */ @Test public void testReceiveBrowseReceive() throws Exception { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQQueue destination = (ActiveMQQueue) this.createDestination(session, ActiveMQDestination.QUEUE_TYPE); MessageProducer producer = session.createProducer(destination); MessageConsumer consumer = session.createConsumer(destination); connection.start(); Message[] outbound = new Message[]{session.createTextMessage("First Message"), session.createTextMessage("Second Message"), session.createTextMessage("Third Message")}; // lets consume any outstanding messages from previous test runs while (consumer.receive(1000) != null) { } producer.send(outbound[0]); producer.send(outbound[1]); producer.send(outbound[2]); // Get the first. assertEquals(outbound[0], consumer.receive(1000)); consumer.close(); System.out.println("creating browser..."); QueueBrowser browser = session.createBrowser(destination); System.out.println("browser created"); Enumeration<?> enumeration = browser.getEnumeration(); // browse the second assertTrue("should have received the second message", enumeration.hasMoreElements()); assertEquals(outbound[1], enumeration.nextElement()); // browse the third. assertTrue("Should have received the third message", enumeration.hasMoreElements()); assertEquals(outbound[2], enumeration.nextElement()); // There should be no more. boolean tooMany = false; while (enumeration.hasMoreElements()) { System.out.println("Got extra message: " + ((TextMessage) enumeration.nextElement()).getText()); tooMany = true; } assertFalse(tooMany); browser.close(); // Re-open the consumer. consumer = session.createConsumer(destination); // Receive the second. assertEquals(outbound[1], consumer.receive(1000)); // Receive the third. assertEquals(outbound[2], consumer.receive(1000)); consumer.close(); } @Test public void testBatchSendBrowseReceive() throws Exception { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQQueue destination = (ActiveMQQueue) this.createDestination(session, ActiveMQDestination.QUEUE_TYPE); MessageProducer producer = session.createProducer(destination); MessageConsumer consumer = session.createConsumer(destination); connection.start(); TextMessage[] outbound = new TextMessage[10]; for (int i = 0; i < 10; i++) { outbound[i] = session.createTextMessage(i + " Message"); } // lets consume any outstanding messages from previous test runs while (consumer.receive(1000) != null) { } consumer.close(); for (int i = 0; i < outbound.length; i++) { producer.send(outbound[i]); } QueueBrowser browser = session.createBrowser(destination); Enumeration<?> enumeration = browser.getEnumeration(); for (int i = 0; i < outbound.length; i++) { assertTrue("should have a", enumeration.hasMoreElements()); assertEquals(outbound[i], enumeration.nextElement()); } browser.close(); for (int i = 0; i < outbound.length; i++) { producer.send(outbound[i]); } // verify second batch is visible to browse browser = session.createBrowser(destination); enumeration = browser.getEnumeration(); for (int j = 0; j < 2; j++) { for (int i = 0; i < outbound.length; i++) { assertTrue("should have a", enumeration.hasMoreElements()); assertEquals("j=" + j + ", i=" + i, outbound[i].getText(), ((TextMessage) enumeration.nextElement()).getText()); } } browser.close(); consumer = session.createConsumer(destination); for (int i = 0; i < outbound.length * 2; i++) { assertNotNull("Got message: " + i, consumer.receive(2000)); } consumer.close(); } /* disable this test because it uses management mbeans which we don't implement yet. @Test public void testBatchSendJmxBrowseReceive() throws Exception { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQQueue destination = new ActiveMQQueue("TEST"); MessageProducer producer = session.createProducer(destination); MessageConsumer consumer = session.createConsumer(destination); connection.start(); TextMessage[] outbound = new TextMessage[10]; for (int i = 0; i < 10; i++) { outbound[i] = session.createTextMessage(i + " Message"); } ; // lets consume any outstanding messages from previous test runs while (consumer.receive(1000) != null) { } consumer.close(); for (int i = 0; i < outbound.length; i++) { producer.send(outbound[i]); } ObjectName queueViewMBeanName = new ObjectName( "org.apache.activemq.artemis:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=TEST"); System.out.println("Create QueueView MBean..."); QueueViewMBean proxy = (QueueViewMBean) broker.getManagementContext() .newProxyInstance(queueViewMBeanName, QueueViewMBean.class, true); long concount = proxy.getConsumerCount(); System.out.println("Consumer Count :" + concount); long messcount = proxy.getQueueSize(); System.out.println("current number of messages in the queue :" + messcount); // lets browse CompositeData[] compdatalist = proxy.browse(); if (compdatalist.length == 0) { fail("There is no message in the queue:"); } String[] messageIDs = new String[compdatalist.length]; for (int i = 0; i < compdatalist.length; i++) { CompositeData cdata = compdatalist[i]; if (i == 0) { System.out.println("Columns: " + cdata.getCompositeType().keySet()); } messageIDs[i] = (String) cdata.get("JMSMessageID"); System.out.println("message " + i + " : " + cdata.values()); } TabularData table = proxy.browseAsTable(); System.out.println("Found tabular data: " + table); assertTrue("Table should not be empty!", table.size() > 0); assertEquals("Queue size", outbound.length, proxy.getQueueSize()); assertEquals("Queue size", outbound.length, compdatalist.length); assertEquals("Queue size", outbound.length, table.size()); System.out.println("Send another 10"); for (int i = 0; i < outbound.length; i++) { producer.send(outbound[i]); } System.out.println("Browse again"); messcount = proxy.getQueueSize(); System.out.println("current number of messages in the queue :" + messcount); compdatalist = proxy.browse(); if (compdatalist.length == 0) { fail("There is no message in the queue:"); } messageIDs = new String[compdatalist.length]; for (int i = 0; i < compdatalist.length; i++) { CompositeData cdata = compdatalist[i]; if (i == 0) { System.out.println("Columns: " + cdata.getCompositeType().keySet()); } messageIDs[i] = (String) cdata.get("JMSMessageID"); System.out.println("message " + i + " : " + cdata.values()); } table = proxy.browseAsTable(); System.out.println("Found tabular data: " + table); assertTrue("Table should not be empty!", table.size() > 0); assertEquals("Queue size", outbound.length * 2, proxy.getQueueSize()); assertEquals("Queue size", outbound.length * 2, compdatalist.length); assertEquals("Queue size", outbound.length * 2, table.size()); consumer = session.createConsumer(destination); for (int i = 0; i < outbound.length * 2; i++) { assertNotNull("Got message: " + i, consumer.receive(2000)); } consumer.close(); } */ @Test public void testBrowseReceive() throws Exception { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQQueue destination = (ActiveMQQueue) this.createDestination(session, ActiveMQDestination.QUEUE_TYPE); connection.start(); // create consumer MessageConsumer consumer = session.createConsumer(destination); System.out.println("created consumer ... "); // lets consume any outstanding messages from previous test runs while (consumer.receive(1000) != null) { } consumer.close(); Message[] outbound = new Message[]{session.createTextMessage("First Message"), session.createTextMessage("Second Message"), session.createTextMessage("Third Message")}; MessageProducer producer = session.createProducer(destination); producer.send(outbound[0]); // create browser first System.out.println("creating browser..."); QueueBrowser browser = session.createBrowser(destination); System.out.println("created " + browser); Enumeration<?> enumeration = browser.getEnumeration(); System.out.println("browsing first"); // browse the first message assertTrue("should have received the first message", enumeration.hasMoreElements()); System.out.println("we have more"); assertEquals(outbound[0], enumeration.nextElement()); System.out.println("ok"); consumer = session.createConsumer(destination); // Receive the first message. assertEquals(outbound[0], consumer.receive(1000)); consumer.close(); browser.close(); producer.close(); System.out.println("test done."); } @Test public void testLargeNumberOfMessages() throws Exception { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQQueue destination = (ActiveMQQueue) this.createDestination(session, ActiveMQDestination.QUEUE_TYPE); connection.start(); MessageProducer producer = session.createProducer(destination); int numberOfMessages = 4096; for (int i = 0; i < numberOfMessages; i++) { producer.send(session.createTextMessage("Message: " + i)); } QueueBrowser browser = session.createBrowser(destination); Enumeration<?> enumeration = browser.getEnumeration(); assertTrue(enumeration.hasMoreElements()); int numberBrowsed = 0; while (enumeration.hasMoreElements()) { Message browsed = (Message) enumeration.nextElement(); System.out.println("Browsed Message [{}]" + browsed.getJMSMessageID()); numberBrowsed++; } System.out.println("Number browsed: " + numberBrowsed); assertEquals(numberOfMessages, numberBrowsed); browser.close(); producer.close(); } /* @Test public void testQueueBrowserWith2Consumers() throws Exception { final int numMessages = 1000; connection.setAlwaysSyncSend(false); Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE); ActiveMQQueue destination = (ActiveMQQueue) this.createDestination(session, ActiveMQDestination.QUEUE_TYPE); ActiveMQQueue destinationPrefetch10 = new ActiveMQQueue( "TEST?jms.prefetchSize=10"); ActiveMQQueue destinationPrefetch1 = new ActiveMQQueue( "TEST?jms.prefetchsize=1"); connection.start(); ActiveMQConnection connection2 = (ActiveMQConnection) factory .createConnection(); connection2.start(); Session session2 = connection2.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer producer = session.createProducer(destination); MessageConsumer consumer = session.createConsumer(destinationPrefetch10); // lets consume any outstanding messages from previous test runs while (consumer.receive(1000) != null) { } consumer.close(); for (int i = 0; i < numMessages; i++) { TextMessage message = session.createTextMessage("Message: " + i); producer.send(message); } QueueBrowser browser = session2.createBrowser(destinationPrefetch1); @SuppressWarnings("unchecked") Enumeration<Message> browserView = browser.getEnumeration(); List<Message> messages = new ArrayList<Message>(); for (int i = 0; i < numMessages; i++) { Message m1 = consumer.receive(5000); assertNotNull("m1 is null for index: " + i, m1); messages.add(m1); } int i = 0; for (; i < numMessages && browserView.hasMoreElements(); i++) { Message m1 = messages.get(i); Message m2 = browserView.nextElement(); assertNotNull("m2 is null for index: " + i, m2); assertEquals(m1.getJMSMessageID(), m2.getJMSMessageID()); } // currently browse max page size is ignored for a queue browser consumer // only guarantee is a page size - but a snapshot of pagedinpending is // used so it is most likely more assertTrue("got at least our expected minimum in the browser: ", i > 200); assertFalse("nothing left in the browser", browserView.hasMoreElements()); assertNull("consumer finished", consumer.receiveNoWait()); connection2.close(); } */ @Test public void testBrowseClose() throws Exception { Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); ActiveMQQueue destination = (ActiveMQQueue) this.createDestination(session, ActiveMQDestination.QUEUE_TYPE); connection.start(); TextMessage[] outbound = new TextMessage[]{session.createTextMessage("First Message"), session.createTextMessage("Second Message"), session.createTextMessage("Third Message")}; // create consumer MessageConsumer consumer = session.createConsumer(destination); // lets consume any outstanding messages from previous test runs while (consumer.receive(1000) != null) { } consumer.close(); MessageProducer producer = session.createProducer(destination); producer.send(outbound[0]); producer.send(outbound[1]); producer.send(outbound[2]); // create browser first QueueBrowser browser = session.createBrowser(destination); Enumeration<?> enumeration = browser.getEnumeration(); // browse some messages assertEquals(outbound[0], enumeration.nextElement()); assertEquals(outbound[1], enumeration.nextElement()); // assertEquals(outbound[2], (Message) enumeration.nextElement()); browser.close(); consumer = session.createConsumer(destination); // Receive the first message. TextMessage msg = (TextMessage) consumer.receive(1000); assertEquals("Expected " + outbound[0].getText() + " but received " + msg.getText(), outbound[0], msg); msg = (TextMessage) consumer.receive(1000); assertEquals("Expected " + outbound[1].getText() + " but received " + msg.getText(), outbound[1], msg); msg = (TextMessage) consumer.receive(1000); assertEquals("Expected " + outbound[2].getText() + " but received " + msg.getText(), outbound[2], msg); consumer.close(); producer.close(); } }