// ********************************************************************** // // Copyright (c) 2003-2009 ZeroC, Inc. All rights reserved. // // This copy of Ice is licensed to you under the terms described in the // ICE_LICENSE file included in this distribution. // // ********************************************************************** #include #include #include #include #include #include #include #include using namespace std; using namespace IceStorm; using namespace IceStormElection; Instance::Instance( const string& instanceName, const string& name, const Ice::CommunicatorPtr& communicator, const DatabaseCachePtr& databaseCache, const Ice::ObjectAdapterPtr& publishAdapter, const Ice::ObjectAdapterPtr& topicAdapter, const Ice::ObjectAdapterPtr& nodeAdapter, const NodePrx& nodeProxy) : _instanceName(instanceName), _serviceName(name), _communicator(communicator), _publishAdapter(publishAdapter), _topicAdapter(topicAdapter), _nodeAdapter(nodeAdapter), _nodeProxy(nodeProxy), _traceLevels(new TraceLevels(name, communicator->getProperties(), communicator->getLogger())), _discardInterval(IceUtil::Time::seconds(communicator->getProperties()->getPropertyAsIntWithDefault( name + ".Discard.Interval", 60))), // default one minute. _flushInterval(IceUtil::Time::milliSeconds(communicator->getProperties()->getPropertyAsIntWithDefault( name + ".Flush.Timeout", 1000))), // default one second. // default one minute. _sendTimeout(communicator->getProperties()->getPropertyAsIntWithDefault(name + ".Send.Timeout", 60 * 1000)), _databaseCache(databaseCache) { try { __setNoDelete(true); Ice::PropertiesPtr properties = communicator->getProperties(); if(properties->getProperty(name + ".TopicManager.AdapterId").empty()) { string p = properties->getProperty(name + ".ReplicatedTopicManagerEndpoints"); if(!p.empty()) { const_cast(_topicReplicaProxy) = communicator->stringToProxy("dummy:" + p); } p = properties->getProperty(name + ".ReplicatedPublishEndpoints"); if(!p.empty()) { const_cast(_publisherReplicaProxy) = communicator->stringToProxy("dummy:" + p); } } _observers = new Observers(this); _batchFlusher = new IceUtil::Timer(); _timer = new IceUtil::Timer(); } catch(...) { shutdown(); destroy(); __setNoDelete(false); throw; } __setNoDelete(false); } Instance::~Instance() { //cout << "~Instance" << endl; } void Instance::setNode(const NodeIPtr& node) { _node = node; } string Instance::instanceName() const { return _instanceName; } string Instance::serviceName() const { return _serviceName; } Ice::CommunicatorPtr Instance::communicator() const { return _communicator; } Ice::PropertiesPtr Instance::properties() const { return _communicator->getProperties(); } Ice::ObjectAdapterPtr Instance::publishAdapter() const { return _publishAdapter; } Ice::ObjectAdapterPtr Instance::topicAdapter() const { return _topicAdapter; } Ice::ObjectAdapterPtr Instance::nodeAdapter() const { return _nodeAdapter; } ObserversPtr Instance::observers() const { return _observers; } NodeIPtr Instance::node() const { return _node; } NodePrx Instance::nodeProxy() const { return _nodeProxy; } TraceLevelsPtr Instance::traceLevels() const { return _traceLevels; } IceUtil::TimerPtr Instance::batchFlusher() const { return _batchFlusher; } IceUtil::TimerPtr Instance::timer() const { return _timer; } Ice::ObjectPrx Instance::topicReplicaProxy() const { return _topicReplicaProxy; } Ice::ObjectPrx Instance::publisherReplicaProxy() const { return _publisherReplicaProxy; } DatabaseCachePtr Instance::databaseCache() const { return _databaseCache; } IceUtil::Time Instance::discardInterval() const { return _discardInterval; } IceUtil::Time Instance::flushInterval() const { return _flushInterval; } int Instance::sendTimeout() const { return _sendTimeout; } void Instance::shutdown() { if(_node) { _node->destroy(); assert(_nodeAdapter); _nodeAdapter->destroy(); } _topicAdapter->destroy(); _publishAdapter->destroy(); if(_timer) { _timer->destroy(); } } void Instance::destroy() { if(_batchFlusher) { _batchFlusher->destroy(); } // The node instance must be cleared as the node holds the // replica (TopicManager) which holds the instance causing a // cyclic reference. _node = 0; }