diff options
Diffstat (limited to 'cpp/src/Glacier2/SessionRouterI.cpp')
-rw-r--r-- | cpp/src/Glacier2/SessionRouterI.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/cpp/src/Glacier2/SessionRouterI.cpp b/cpp/src/Glacier2/SessionRouterI.cpp index f4b2b5fa08e..61362c9ef85 100644 --- a/cpp/src/Glacier2/SessionRouterI.cpp +++ b/cpp/src/Glacier2/SessionRouterI.cpp @@ -12,6 +12,8 @@ #include <Glacier2/SessionRouterI.h> #include <Glacier2/RouterI.h> +#include <IceUtil/UUID.h> + using namespace std; using namespace Ice; using namespace Glacier2; @@ -87,6 +89,8 @@ Glacier2::SessionRouterI::SessionRouterI(const ObjectAdapterPtr& clientAdapter, _serverAdapter(serverAdapter), _verifier(verifier), _sessionManager(sessionManager), + _sessionCloseCountDefault(_properties->getPropertyAsIntWithDefault("Glacier2.SessionManager.CloseCount", 0)), + _sessionCloseCount(0), _sessionTimeout(IceUtil::Time::seconds(_properties->getPropertyAsInt("Glacier2.SessionTimeout"))), _sessionThread(_sessionTimeout > IceUtil::Time() ? new SessionThread(this, _sessionTimeout) : 0), _routersByConnectionHint(_routersByConnection.end()), @@ -108,6 +112,18 @@ Glacier2::SessionRouterI::SessionRouterI(const ObjectAdapterPtr& clientAdapter, _clientAdapter->add(this, id); // + // If we have a session manager configured, and a the property to + // close the connection set then we want to set a unique + // connection on the session manager so that we don't close the + // connections to the sessions all the time. + // + if(_sessionManager && _sessionCloseCountDefault > 0) + { + _sessionCloseCount = _sessionCloseCountDefault; + _sessionManager = SessionManagerPrx::uncheckedCast(_sessionManager->ice_connectionId(IceUtil::generateUUID())); + } + + // // All other calls on the client object adapter are dispatched to // a router servant based on connection information. // @@ -394,6 +410,32 @@ Glacier2::SessionRouterI::createSession(const std::string& userId, const std::st { IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this); + + // + // Determine whether we should close the connection to the + // session manager. + // + if(_sessionCloseCount > 0) + { + assert(_sessionManager); + --_sessionCloseCount; + if(_sessionCloseCount == 0) + { + _sessionCloseCount = _sessionCloseCountDefault; + try + { + Ice::ConnectionPtr connection = _sessionManager->ice_connection(); + if(connection) + { + connection->close(false); + } + } + catch(const Exception&) + { + // Ignore all exceptions here. + } + } + } // // Signal other threads that we are done with trying to |