summaryrefslogtreecommitdiff
path: root/cpp/src/Glacier2/SessionRouterI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/Glacier2/SessionRouterI.cpp')
-rw-r--r--cpp/src/Glacier2/SessionRouterI.cpp42
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