blob: f23f75891635b0b905091606241871681a90dc68 [file] [log] [blame]
/**
* 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.bugs;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.jms.*;
import javax.jms.Queue;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.command.ActiveMQQueue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class AMQ2171Test implements Thread.UncaughtExceptionHandler {
private static final Logger LOG = LoggerFactory.getLogger(AMQ2171Test.class);
private static final String BROKER_URL = "tcp://localhost:0";
private static final int QUEUE_SIZE = 100;
private static BrokerService brokerService;
private static Queue destination;
private String brokerUri;
private String brokerUriNoPrefetch;
private Collection<Throwable> exceptions = new CopyOnWriteArrayList<Throwable>();
@Before
public void setUp() throws Exception {
// Start an embedded broker up.
brokerService = new BrokerService();
brokerService.setDeleteAllMessagesOnStartup(true);
brokerService.addConnector(BROKER_URL);
brokerService.start();
brokerUri = brokerService.getTransportConnectors().get(0).getPublishableConnectString().toString();
brokerUriNoPrefetch = brokerUri + "?jms.prefetchPolicy.all=0";
destination = new ActiveMQQueue("Test");
produce(brokerUri, QUEUE_SIZE);
}
@Before
public void addHandler() {
Thread.setDefaultUncaughtExceptionHandler(this);
}
@After
public void tearDown() throws Exception {
brokerService.stop();
}
@Test(timeout = 10000)
public void testBrowsePrefetch() throws Exception {
runTest(brokerUri);
}
@Test(timeout = 10000)
public void testBrowseNoPrefetch() throws Exception {
runTest(brokerUriNoPrefetch);
}
private void runTest(String brokerURL) throws Exception {
Connection connection = new ActiveMQConnectionFactory(brokerURL).createConnection();
try {
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
@SuppressWarnings("unchecked")
Enumeration<Message> unread = (Enumeration<Message>) session.createBrowser(destination).getEnumeration();
int count = 0;
while (unread.hasMoreElements()) {
unread.nextElement();
count++;
}
assertEquals(QUEUE_SIZE, count);
assertTrue(exceptions.isEmpty());
} finally {
try {
connection.close();
} catch (JMSException e) {
exceptions.add(e);
}
}
}
private static void produce(String brokerURL, int count) throws Exception {
Connection connection = null;
try {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(brokerURL);
connection = factory.createConnection();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(destination);
producer.setTimeToLive(0);
connection.start();
for (int i = 0; i < count; i++) {
int id = i + 1;
TextMessage message = session.createTextMessage("Message " + id);
message.setIntProperty("MsgNumber", id);
producer.send(message);
if (id % 500 == 0) {
LOG.info("sent " + id + ", ith " + message);
}
}
} finally {
try {
if (connection != null) {
connection.close();
}
} catch (Throwable e) {
}
}
}
public void uncaughtException(Thread t, Throwable e) {
exceptions.add(e);
}
}