/** * 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.assertNotSame; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.util.concurrent.TimeUnit; import javax.jms.Connection; import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.broker.BrokerService; import org.apache.activemq.broker.TransportConnector; import org.junit.After; import org.junit.Before; import org.junit.Test; public class ConnectionExpiryEvictsFromPoolTest extends JmsPoolTestSupport { 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()); pooledFactory = new PooledConnectionFactory(); pooledFactory.setConnectionFactory(factory); pooledFactory.setMaxConnections(1); } @Override @After public void tearDown() throws Exception { try { pooledFactory.stop(); } catch (Exception ex) { // ignored } super.tearDown(); } @Test(timeout = 60000) public void testEvictionOfIdle() throws Exception { pooledFactory.setIdleTimeout(10); PooledConnection connection = (PooledConnection) pooledFactory.createConnection(); Connection amq1 = connection.getConnection(); connection.close(); // let it idle timeout TimeUnit.MILLISECONDS.sleep(500); PooledConnection connection2 = (PooledConnection) pooledFactory.createConnection(); Connection amq2 = connection2.getConnection(); assertTrue("not equal", !amq1.equals(amq2)); } @Test(timeout = 60000) public void testEvictionOfExpired() throws Exception { pooledFactory.setExpiryTimeout(10); Connection connection = pooledFactory.createConnection(); Connection amq1 = ((PooledConnection) connection).getConnection(); // let it expire while in use TimeUnit.MILLISECONDS.sleep(500); connection.close(); Connection connection2 = pooledFactory.createConnection(); Connection amq2 = ((PooledConnection) connection2).getConnection(); assertTrue("not equal", !amq1.equals(amq2)); } @Test(timeout = 60000) public void testNotIdledWhenInUse() throws Exception { pooledFactory.setIdleTimeout(10); PooledConnection connection = (PooledConnection) pooledFactory.createConnection(); Session s = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // let connection to get idle TimeUnit.MILLISECONDS.sleep(500); // get a connection from pool again, it should be the same underlying connection // as before and should not be idled out since an open session exists. PooledConnection connection2 = (PooledConnection) pooledFactory.createConnection(); assertSame(connection.getConnection(), connection2.getConnection()); // now the session is closed even when it should not be try { // any operation on session first checks whether session is closed s.getTransacted(); } catch (javax.jms.IllegalStateException e) { assertTrue("Session should be fine, instead: " + e.getMessage(), false); } Connection original = connection.getConnection(); connection.close(); connection2.close(); // let connection to get idle TimeUnit.MILLISECONDS.sleep(500); // get a connection from pool again, it should be a new Connection instance as the // old one should have been inactive and idled out. PooledConnection connection3 = (PooledConnection) pooledFactory.createConnection(); assertNotSame(original, connection3.getConnection()); } }