/* * 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. */ #include "SessionPool.h" #include "ResourceLifecycleManager.h" using namespace activemq::cmsutil; using namespace std; //////////////////////////////////////////////////////////////////////////////// SessionPool::SessionPool(cms::Connection* connection, cms::Session::AcknowledgeMode ackMode, ResourceLifecycleManager* resourceLifecycleManager) : connection(connection), resourceLifecycleManager(resourceLifecycleManager), mutex(), available(), sessions(), acknowledgeMode(ackMode) { } //////////////////////////////////////////////////////////////////////////////// SessionPool::~SessionPool() { try { // Destroy all of the pooled session objects. list::iterator iter = sessions.begin(); for (; iter != sessions.end(); ++iter) { try { delete *iter; } catch (...) {} } sessions.clear(); available.clear(); } catch(...) { } } //////////////////////////////////////////////////////////////////////////////// PooledSession* SessionPool::takeSession() { synchronized(&mutex) { PooledSession* pooledSession = NULL; // If there are no sessions available, create a new one and return it. if (available.size() == 0) { // No sessions were available - create a new one. cms::Session* session = connection->createSession(acknowledgeMode); // Give this resource to the life-cycle manager to manage. The pool // will not be in charge of destroying this resource. resourceLifecycleManager->addSession(session); // Now wrap the session with a pooled session. pooledSession = new PooledSession(this, session); // Add to the sessions list. sessions.push_back(pooledSession); } else { // There are sessions available - use the one at the head of the // list, and remove it from the available list. pooledSession = available.front(); available.pop_front(); } // Return the session. return pooledSession; } // Fixes compiler warnings. return NULL; } //////////////////////////////////////////////////////////////////////////////// void SessionPool::returnSession(PooledSession* session) { synchronized(&mutex) { // Add to the available list. available.push_back(session); } }