blob: 3a07ed4dfd5bdd9fedc39ad2e5975d4670f71228 [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.
*/
#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<PooledSession*>::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);
}
}