/** * 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.jms.pool; import static org.junit.Assert.assertEquals; import javax.jms.Connection; import javax.jms.Queue; import javax.jms.Session; import javax.jms.Topic; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.broker.BrokerService; import org.apache.activemq.broker.TransportConnector; import org.apache.activemq.broker.region.RegionBroker; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class PooledConnectionFactoryWithTemporaryDestinationsTest extends JmsPoolTestSupport { private static final Logger LOG = LoggerFactory.getLogger(PooledConnectionFactoryWithTemporaryDestinationsTest.class); private ActiveMQConnectionFactory factory; private PooledConnectionFactory pooledFactory; @Override @Before public void setUp() throws Exception { super.setUp(); brokerService = new BrokerService(); brokerService.setUseJmx(false); brokerService.setPersistent(false); brokerService.setSchedulerSupport(false); brokerService.setAdvisorySupport(false); TransportConnector connector = brokerService.addConnector("tcp://localhost:0"); brokerService.start(); factory = new ActiveMQConnectionFactory("mock:" + connector.getConnectUri() + "?closeAsync=false"); pooledFactory = new PooledConnectionFactory(); pooledFactory.setConnectionFactory(factory); } @Test(timeout = 60000) public void testTemporaryQueueWithMultipleConnectionUsers() throws Exception { Connection pooledConnection = null; Connection pooledConnection2 = null; Session session = null; Session session2 = null; Queue tempQueue = null; Queue normalQueue = null; pooledConnection = pooledFactory.createConnection(); session = pooledConnection.createSession(false, Session.AUTO_ACKNOWLEDGE); tempQueue = session.createTemporaryQueue(); LOG.info("Created queue named: " + tempQueue.getQueueName()); assertEquals(1, countBrokerTemporaryQueues()); pooledConnection2 = pooledFactory.createConnection(); session2 = pooledConnection2.createSession(false, Session.AUTO_ACKNOWLEDGE); normalQueue = session2.createQueue("queue:FOO.TEST"); LOG.info("Created queue named: " + normalQueue.getQueueName()); // didn't create a temp queue on pooledConnection2 so we should still have a temp queue pooledConnection2.close(); assertEquals(1, countBrokerTemporaryQueues()); // after closing pooledConnection, where we created the temp queue, there should // be no temp queues left pooledConnection.close(); assertEquals(0, countBrokerTemporaryQueues()); } @Test(timeout = 60000) public void testTemporaryQueueLeakAfterConnectionClose() throws Exception { Connection pooledConnection = null; Session session = null; Queue tempQueue = null; for (int i = 0; i < 2; i++) { pooledConnection = pooledFactory.createConnection(); session = pooledConnection.createSession(false, Session.AUTO_ACKNOWLEDGE); tempQueue = session.createTemporaryQueue(); LOG.info("Created queue named: " + tempQueue.getQueueName()); pooledConnection.close(); } assertEquals(0, countBrokerTemporaryQueues()); } @Test(timeout = 60000) public void testTemporaryTopicLeakAfterConnectionClose() throws Exception { Connection pooledConnection = null; Session session = null; Topic tempTopic = null; for (int i = 0; i < 2; i++) { pooledConnection = pooledFactory.createConnection(); session = pooledConnection.createSession(false, Session.AUTO_ACKNOWLEDGE); tempTopic = session.createTemporaryTopic(); LOG.info("Created topic named: " + tempTopic.getTopicName()); pooledConnection.close(); } assertEquals(0, countBrokerTemporaryTopics()); } private int countBrokerTemporaryQueues() throws Exception { return ((RegionBroker) brokerService.getRegionBroker()).getTempQueueRegion().getDestinationMap().size(); } private int countBrokerTemporaryTopics() throws Exception { return ((RegionBroker) brokerService.getRegionBroker()).getTempTopicRegion().getDestinationMap().size(); } }