summaryrefslogtreecommitdiff
path: root/cpp/src/IceBox/ServiceManagerI.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2012-10-08 15:03:46 +0200
committerBenoit Foucher <benoit@zeroc.com>2012-10-08 15:03:46 +0200
commitd36ec7c740d5dfaa8e4ce2a2df6c9cb0818f01ae (patch)
tree7abffd29e98ff112cec85b658fab404961f8306a /cpp/src/IceBox/ServiceManagerI.cpp
parentFreeBSD port (diff)
parentWin32 fixes (diff)
downloadice-d36ec7c740d5dfaa8e4ce2a2df6c9cb0818f01ae.tar.bz2
ice-d36ec7c740d5dfaa8e4ce2a2df6c9cb0818f01ae.tar.xz
ice-d36ec7c740d5dfaa8e4ce2a2df6c9cb0818f01ae.zip
Merge branch 'mx' into encoding11
Conflicts: cpp/demo/Freeze/backup/.depend cpp/demo/Freeze/backup/.depend.mak cpp/demo/Freeze/bench/.depend cpp/demo/Freeze/bench/.depend.mak cpp/demo/Freeze/casino/.depend cpp/demo/Freeze/casino/.depend.mak cpp/demo/Freeze/customEvictor/.depend cpp/demo/Freeze/customEvictor/.depend.mak cpp/demo/Freeze/library/.depend cpp/demo/Freeze/library/.depend.mak cpp/demo/Freeze/phonebook/.depend cpp/demo/Freeze/phonebook/.depend.mak cpp/demo/Freeze/transform/.depend cpp/demo/Freeze/transform/.depend.mak cpp/demo/Glacier2/callback/.depend cpp/demo/Glacier2/callback/.depend.mak cpp/demo/Glacier2/chat/.depend cpp/demo/Glacier2/chat/.depend.mak cpp/demo/Ice/async/.depend cpp/demo/Ice/async/.depend.mak cpp/demo/Ice/bidir/.depend cpp/demo/Ice/bidir/.depend.mak cpp/demo/Ice/callback/.depend cpp/demo/Ice/callback/.depend.mak cpp/demo/Ice/converter/.depend cpp/demo/Ice/converter/.depend.mak cpp/demo/Ice/hello/.depend cpp/demo/Ice/hello/.depend.mak cpp/demo/Ice/interleaved/.depend cpp/demo/Ice/interleaved/.depend.mak cpp/demo/Ice/invoke/.depend cpp/demo/Ice/invoke/.depend.mak cpp/demo/Ice/latency/.depend cpp/demo/Ice/latency/.depend.mak cpp/demo/Ice/minimal/.depend cpp/demo/Ice/minimal/.depend.mak cpp/demo/Ice/multicast/.depend cpp/demo/Ice/multicast/.depend.mak cpp/demo/Ice/nested/.depend cpp/demo/Ice/nested/.depend.mak cpp/demo/Ice/nrvo/.depend cpp/demo/Ice/nrvo/.depend.mak cpp/demo/Ice/plugin/.depend cpp/demo/Ice/plugin/.depend.mak cpp/demo/Ice/session/.depend cpp/demo/Ice/session/.depend.mak cpp/demo/Ice/throughput/.depend cpp/demo/Ice/throughput/.depend.mak cpp/demo/Ice/value/.depend cpp/demo/Ice/value/.depend.mak cpp/demo/IceBox/hello/.depend cpp/demo/IceBox/hello/.depend.mak cpp/demo/IceGrid/allocate/.depend cpp/demo/IceGrid/allocate/.depend.mak cpp/demo/IceGrid/icebox/.depend cpp/demo/IceGrid/icebox/.depend.mak cpp/demo/IceGrid/replication/.depend cpp/demo/IceGrid/replication/.depend.mak cpp/demo/IceGrid/secure/.depend cpp/demo/IceGrid/secure/.depend.mak cpp/demo/IceGrid/sessionActivation/.depend cpp/demo/IceGrid/sessionActivation/.depend.mak cpp/demo/IceGrid/simple/.depend cpp/demo/IceGrid/simple/.depend.mak cpp/demo/IceStorm/clock/.depend cpp/demo/IceStorm/clock/.depend.mak cpp/demo/IceStorm/counter/.depend cpp/demo/IceStorm/counter/.depend.mak cpp/demo/IceStorm/replicated/.depend cpp/demo/IceStorm/replicated/.depend.mak cpp/demo/IceStorm/replicated2/.depend cpp/demo/IceStorm/replicated2/.depend.mak cpp/demo/book/evictor_filesystem/.depend cpp/demo/book/evictor_filesystem/.depend.mak cpp/demo/book/lifecycle/.depend cpp/demo/book/lifecycle/.depend.mak cpp/demo/book/map_filesystem/.depend cpp/demo/book/map_filesystem/.depend.mak cpp/demo/book/printer/.depend cpp/demo/book/printer/.depend.mak cpp/demo/book/simple_filesystem/.depend cpp/demo/book/simple_filesystem/.depend.mak cpp/include/Ice/Outgoing.h cpp/include/Ice/OutgoingAsync.h cpp/include/Ice/StreamTraits.h cpp/src/Freeze/.depend cpp/src/Freeze/.depend.mak cpp/src/FreezeScript/.depend cpp/src/FreezeScript/.depend.mak cpp/src/Glacier2/.depend cpp/src/Glacier2/.depend.mak cpp/src/Glacier2Lib/.depend cpp/src/Glacier2Lib/.depend.mak cpp/src/Ice/.depend cpp/src/Ice/.depend.mak cpp/src/IceBox/.depend cpp/src/IceBox/.depend.mak cpp/src/IceDB/.depend cpp/src/IceDB/.depend.mak cpp/src/IceGrid/.depend cpp/src/IceGrid/.depend.mak cpp/src/IceGrid/FreezeDB/.depend cpp/src/IceGrid/FreezeDB/.depend.mak cpp/src/IceGrid/ServerCache.h cpp/src/IceGrid/ServerI.h cpp/src/IceGridLib/.depend cpp/src/IceGridLib/.depend.mak cpp/src/IcePatch2/.depend cpp/src/IcePatch2/.depend.mak cpp/src/IcePatch2Lib/.depend cpp/src/IcePatch2Lib/.depend.mak cpp/src/IceSSL/.depend cpp/src/IceSSL/.depend.mak cpp/src/IceStorm/.depend cpp/src/IceStorm/.depend.mak cpp/src/IceStorm/FreezeDB/.depend cpp/src/IceStorm/FreezeDB/.depend.mak cpp/src/IceStormLib/.depend cpp/src/IceStormLib/.depend.mak cpp/src/slice2cpp/Gen.cpp cpp/test/Freeze/complex/.depend cpp/test/Freeze/complex/.depend.mak cpp/test/Freeze/dbmap/.depend cpp/test/Freeze/dbmap/.depend.mak cpp/test/Freeze/evictor/.depend cpp/test/Freeze/evictor/.depend.mak cpp/test/Freeze/fileLock/.depend cpp/test/Freeze/fileLock/.depend.mak cpp/test/FreezeScript/dbmap/.depend cpp/test/FreezeScript/dbmap/.depend.mak cpp/test/FreezeScript/evictor/.depend cpp/test/FreezeScript/evictor/.depend.mak cpp/test/Glacier2/attack/.depend cpp/test/Glacier2/attack/.depend.mak cpp/test/Glacier2/dynamicFiltering/.depend cpp/test/Glacier2/dynamicFiltering/.depend.mak cpp/test/Glacier2/override/.depend cpp/test/Glacier2/override/.depend.mak cpp/test/Glacier2/router/.depend cpp/test/Glacier2/router/.depend.mak cpp/test/Glacier2/sessionControl/.depend cpp/test/Glacier2/sessionControl/.depend.mak cpp/test/Glacier2/sessionHelper/.depend cpp/test/Glacier2/sessionHelper/.depend.mak cpp/test/Glacier2/ssl/.depend cpp/test/Glacier2/ssl/.depend.mak cpp/test/Glacier2/staticFiltering/.depend cpp/test/Glacier2/staticFiltering/.depend.mak cpp/test/Ice/adapterDeactivation/.depend cpp/test/Ice/adapterDeactivation/.depend.mak cpp/test/Ice/ami/.depend cpp/test/Ice/ami/.depend.mak cpp/test/Ice/background/.depend cpp/test/Ice/background/.depend.mak cpp/test/Ice/binding/.depend cpp/test/Ice/binding/.depend.mak cpp/test/Ice/checksum/.depend cpp/test/Ice/checksum/.depend.mak cpp/test/Ice/checksum/server/.depend cpp/test/Ice/checksum/server/.depend.mak cpp/test/Ice/custom/.depend cpp/test/Ice/custom/.depend.mak cpp/test/Ice/defaultServant/.depend cpp/test/Ice/defaultServant/.depend.mak cpp/test/Ice/defaultValue/.depend cpp/test/Ice/defaultValue/.depend.mak cpp/test/Ice/dispatcher/.depend cpp/test/Ice/dispatcher/.depend.mak cpp/test/Ice/exceptions/.depend cpp/test/Ice/exceptions/.depend.mak cpp/test/Ice/facets/.depend cpp/test/Ice/facets/.depend.mak cpp/test/Ice/faultTolerance/.depend cpp/test/Ice/faultTolerance/.depend.mak cpp/test/Ice/gc/.depend cpp/test/Ice/gc/.depend.mak cpp/test/Ice/hash/.depend cpp/test/Ice/hash/.depend.mak cpp/test/Ice/hold/.depend cpp/test/Ice/hold/.depend.mak cpp/test/Ice/info/.depend cpp/test/Ice/info/.depend.mak cpp/test/Ice/inheritance/.depend cpp/test/Ice/inheritance/.depend.mak cpp/test/Ice/interceptor/.depend cpp/test/Ice/interceptor/.depend.mak cpp/test/Ice/invoke/.depend cpp/test/Ice/invoke/.depend.mak cpp/test/Ice/location/.depend cpp/test/Ice/location/.depend.mak cpp/test/Ice/objects/.depend cpp/test/Ice/objects/.depend.mak cpp/test/Ice/operations/.depend cpp/test/Ice/operations/.depend.mak cpp/test/Ice/plugin/.depend cpp/test/Ice/plugin/.depend.mak cpp/test/Ice/properties/.depend cpp/test/Ice/properties/.depend.mak cpp/test/Ice/proxy/.depend cpp/test/Ice/proxy/.depend.mak cpp/test/Ice/retry/.depend cpp/test/Ice/retry/.depend.mak cpp/test/Ice/servantLocator/.depend cpp/test/Ice/servantLocator/.depend.mak cpp/test/Ice/slicing/exceptions/.depend cpp/test/Ice/slicing/exceptions/.depend.mak cpp/test/Ice/slicing/objects/.depend cpp/test/Ice/slicing/objects/.depend.mak cpp/test/Ice/stream/.depend cpp/test/Ice/stream/.depend.mak cpp/test/Ice/stringConverter/.depend cpp/test/Ice/stringConverter/.depend.mak cpp/test/Ice/threadPoolPriority/.depend cpp/test/Ice/threadPoolPriority/.depend.mak cpp/test/Ice/timeout/.depend cpp/test/Ice/timeout/.depend.mak cpp/test/Ice/udp/.depend cpp/test/Ice/udp/.depend.mak cpp/test/IceBox/configuration/.depend cpp/test/IceBox/configuration/.depend.mak cpp/test/IceGrid/activation/.depend cpp/test/IceGrid/activation/.depend.mak cpp/test/IceGrid/admin/.depend cpp/test/IceGrid/admin/.depend.mak cpp/test/IceGrid/allocation/.depend cpp/test/IceGrid/allocation/.depend.mak cpp/test/IceGrid/deployer/.depend cpp/test/IceGrid/deployer/.depend.mak cpp/test/IceGrid/distribution/.depend cpp/test/IceGrid/distribution/.depend.mak cpp/test/IceGrid/replicaGroup/.depend cpp/test/IceGrid/replicaGroup/.depend.mak cpp/test/IceGrid/replication/.depend cpp/test/IceGrid/replication/.depend.mak cpp/test/IceGrid/session/.depend cpp/test/IceGrid/session/.depend.mak cpp/test/IceGrid/simple/.depend cpp/test/IceGrid/simple/.depend.mak cpp/test/IceGrid/update/.depend cpp/test/IceGrid/update/.depend.mak cpp/test/IceSSL/configuration/.depend cpp/test/IceSSL/configuration/.depend.mak cpp/test/IceStorm/federation/.depend cpp/test/IceStorm/federation/.depend.mak cpp/test/IceStorm/federation2/.depend cpp/test/IceStorm/federation2/.depend.mak cpp/test/IceStorm/rep1/.depend cpp/test/IceStorm/rep1/.depend.mak cpp/test/IceStorm/repgrid/.depend cpp/test/IceStorm/repgrid/.depend.mak cpp/test/IceStorm/repstress/.depend cpp/test/IceStorm/repstress/.depend.mak cpp/test/IceStorm/single/.depend cpp/test/IceStorm/single/.depend.mak cpp/test/IceStorm/stress/.depend cpp/test/IceStorm/stress/.depend.mak cpp/test/Slice/keyword/.depend cpp/test/Slice/keyword/.depend.mak cpp/test/Slice/parser/.depend cpp/test/Slice/parser/.depend.mak cpp/test/Slice/structure/.depend cpp/test/Slice/structure/.depend.mak py/modules/IcePy/.depend py/modules/IcePy/.depend.mak
Diffstat (limited to 'cpp/src/IceBox/ServiceManagerI.cpp')
-rw-r--r--cpp/src/IceBox/ServiceManagerI.cpp374
1 files changed, 223 insertions, 151 deletions
diff --git a/cpp/src/IceBox/ServiceManagerI.cpp b/cpp/src/IceBox/ServiceManagerI.cpp
index 6a19450e6ce..a81e2a2ea54 100644
--- a/cpp/src/IceBox/ServiceManagerI.cpp
+++ b/cpp/src/IceBox/ServiceManagerI.cpp
@@ -14,6 +14,9 @@
#include <Ice/SliceChecksums.h>
#include <Ice/Initialize.h>
#include <Ice/Instance.h>
+#include <Ice/PropertiesAdminI.h>
+#include <Ice/MetricsAdminI.h>
+#include <Ice/InstrumentationI.h>
#include <IceBox/ServiceManagerI.h>
using namespace Ice;
@@ -25,30 +28,6 @@ typedef IceBox::Service* (*SERVICE_FACTORY)(CommunicatorPtr);
namespace
{
-class PropertiesAdminI : public PropertiesAdmin
-{
-public:
-
- PropertiesAdminI(const PropertiesPtr& properties) :
- _properties(properties)
- {
- }
-
- virtual string getProperty(const string& name, const Current&)
- {
- return _properties->getProperty(name);
- }
-
- virtual PropertyDict getPropertiesForPrefix(const string& prefix, const Current&)
- {
- return _properties->getPropertiesForPrefix(prefix);
- }
-
-private:
-
- const PropertiesPtr _properties;
-};
-
struct StartServiceInfo
{
StartServiceInfo(const std::string& service, const std::string& value, const Ice::StringSeq& serverArgs)
@@ -65,8 +44,8 @@ struct StartServiceInfo
}
catch(const IceUtilInternal::BadOptException& ex)
{
- PluginInitializationException e(__FILE__, __LINE__);
- e.reason = "invalid arguments for service `" + name + "':\n" + ex.reason;
+ FailureException e(__FILE__, __LINE__);
+ e.reason = "ServiceManager: invalid arguments for service `" + name + "':\n" + ex.reason;
throw e;
}
@@ -157,7 +136,7 @@ IceBox::ServiceManagerI::startService(const string& name, const Current&)
info.service->start(name, info.communicator == 0 ? _sharedCommunicator : info.communicator, info.args);
started = true;
}
- catch(const Ice::Exception& ex)
+ catch(const Exception& ex)
{
Warning out(_logger);
out << "ServiceManager: exception in start for service " << info.name << ":\n";
@@ -233,7 +212,7 @@ IceBox::ServiceManagerI::stopService(const string& name, const Current&)
info.service->stop();
stopped = true;
}
- catch(const Ice::Exception& ex)
+ catch(const Exception& ex)
{
Warning out(_logger);
out << "ServiceManager: exception while stopping service " << info.name << ":\n";
@@ -272,7 +251,7 @@ IceBox::ServiceManagerI::stopService(const string& name, const Current&)
}
void
-IceBox::ServiceManagerI::addObserver(const ServiceObserverPrx& observer, const Ice::Current&)
+IceBox::ServiceManagerI::addObserver(const ServiceObserverPrx& observer, const Current&)
{
//
// Null observers and duplicate registrations are ignored
@@ -418,7 +397,29 @@ IceBox::ServiceManagerI::start()
//
q->args = initData.properties->parseCommandLineOptions(q->name, q->args);
}
+
+ //
+ // If Ice metrics are enabled on the IceBox communicator, we also enable them on the
+ // shared communicator.
+ //
+ IceInternal::MetricsAdminIPtr metricsAdmin;
+ if(IceMX::CommunicatorObserverIPtr::dynamicCast(_communicator->getObserver()))
+ {
+ metricsAdmin = new IceInternal::MetricsAdminI(initData.properties, getProcessLogger());
+ initData.observer = new IceMX::CommunicatorObserverI(metricsAdmin);
+ }
+
_sharedCommunicator = initialize(initData);
+
+ //
+ // Ensure the metrics admin plugin uses the same property set as the
+ // communicator. This is necessary to correctly deal with runtime
+ // property updates.
+ //
+ if(metricsAdmin)
+ {
+ metricsAdmin->setProperties(_sharedCommunicator->getProperties());
+ }
}
//
@@ -454,18 +455,6 @@ IceBox::ServiceManagerI::start()
try
{
_communicator->addAdminFacet(this, "IceBox.ServiceManager");
-
- //
- // Add a Properties facet for each service
- //
- for(vector<ServiceInfo>::iterator r = _services.begin(); r != _services.end(); ++r)
- {
- const ServiceInfo& info = *r;
- CommunicatorPtr communicator = info.communicator != 0 ? info.communicator : _sharedCommunicator;
- _communicator->addAdminFacet(new PropertiesAdminI(communicator->getProperties()),
- "IceBox.Service." + info.name + ".Properties");
- }
-
_communicator->getAdmin();
}
catch(const ObjectAdapterDeactivatedException&)
@@ -532,11 +521,6 @@ IceBox::ServiceManagerI::start(const string& service, const string& entryPoint,
{
IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this);
- ServiceInfo info;
- info.name = service;
- info.status = Stopped;
- info.args = args;
-
//
// Load the entry point.
//
@@ -555,57 +539,33 @@ IceBox::ServiceManagerI::start(const string& service, const string& entryPoint,
throw ex;
}
- //
- // Invoke the factory function.
- //
- SERVICE_FACTORY factory = (SERVICE_FACTORY)sym;
- try
- {
- info.service = factory(_communicator);
- }
- catch(const FailureException&)
- {
- throw;
- }
- catch(const Exception& ex)
- {
- ostringstream s;
- s << "ServiceManager: exception in entry point `" + entryPoint + "' for service " << service << ":\n";
- s << ex;
-
- FailureException e(__FILE__, __LINE__);
- e.reason = s.str();
- throw e;
- }
- catch(...)
- {
- ostringstream s;
- s << "ServiceManager: unknown exception in entry point `" + entryPoint + "' for service " << service;
-
- FailureException e(__FILE__, __LINE__);
- e.reason = s.str();
- throw e;
- }
+ ServiceInfo info;
+ info.name = service;
+ info.status = Stopped;
+ info.args = args;
//
- // Invoke Service::start().
+ // If Ice.UseSharedCommunicator.<name> is not defined, create
+ // a communicator for the service. The communicator inherits
+ // from the shared communicator properties. If it's defined
+ // add the service properties to the shared commnunicator
+ // property set.
//
- try
+ Ice::CommunicatorPtr communicator;
+ IceInternal::MetricsAdminIPtr metricsAdmin;
+ if(_communicator->getProperties()->getPropertyAsInt("IceBox.UseSharedCommunicator." + service) > 0)
{
- //
- // If Ice.UseSharedCommunicator.<name> is not defined, create
- // a communicator for the service. The communicator inherits
- // from the shared communicator properties. If it's defined
- // add the service properties to the shared commnunicator
- // property set.
- //
- Ice::CommunicatorPtr communicator;
- if(_communicator->getProperties()->getPropertyAsInt("IceBox.UseSharedCommunicator." + service) > 0)
+ assert(_sharedCommunicator);
+ communicator = _sharedCommunicator;
+ IceMX::CommunicatorObserverIPtr o = IceMX::CommunicatorObserverIPtr::dynamicCast(communicator->getObserver());
+ if(o)
{
- assert(_sharedCommunicator);
- communicator = _sharedCommunicator;
+ metricsAdmin = o->getMetricsAdmin();
}
- else
+ }
+ else
+ {
+ try
{
//
// Create the service properties. We use the communicator properties as the default
@@ -613,6 +573,7 @@ IceBox::ServiceManagerI::start(const string& service, const string& entryPoint,
//
InitializationData initData;
initData.properties = createServiceProperties(service);
+
if(!info.args.empty())
{
//
@@ -620,35 +581,122 @@ IceBox::ServiceManagerI::start(const string& service, const string& entryPoint,
// read the service config file if it's specified with --Ice.Config.
//
initData.properties = createProperties(info.args, initData.properties);
-
+
//
// Next, parse the service "<service>.*" command line options (the Ice command
// line options were parsed by the createProperties above)
//
info.args = initData.properties->parseCommandLineOptions(service, info.args);
}
-
+
//
// Clone the logger to assign a new prefix.
//
initData.logger = _logger->cloneWithPrefix(initData.properties->getProperty("Ice.ProgramName"));
//
+ // If Ice metrics are enabled on the IceBox communicator, we also enable them on
+ // the service communicator.
+ //
+ if(IceMX::CommunicatorObserverIPtr::dynamicCast(_communicator->getObserver()))
+ {
+ metricsAdmin = new IceInternal::MetricsAdminI(initData.properties, initData.logger);
+ initData.observer = new IceMX::CommunicatorObserverI(metricsAdmin);
+ }
+
+ //
// Remaining command line options are passed to the communicator. This is
// necessary for Ice plug-in properties (e.g.: IceSSL).
//
info.communicator = initialize(info.args, initData);
communicator = info.communicator;
+
+ //
+ // Ensure the metrics admin plugin uses the same property set as the
+ // communicator. This is necessary to correctly deal with runtime
+ // property updates.
+ //
+ if(metricsAdmin)
+ {
+ metricsAdmin->setProperties(communicator->getProperties());
+ }
+ }
+ catch(const Exception& ex)
+ {
+ ostringstream s;
+ s << "ServiceManager: exception while starting service " << service << ":\n";
+ s << ex;
+
+ FailureException e(__FILE__, __LINE__);
+ e.reason = s.str();
+ throw e;
}
+ }
+ try
+ {
+ //
+ // Add a PropertiesAdmin facet to the service manager's communicator that provides
+ // access to this service's property set. We do this prior to instantiating the
+ // service so that the service's constructor is able to access the facet (e.g.,
+ // in case it wants to set a callback).
+ //
+ string facetName = "IceBox.Service." + info.name + ".Properties";
+ PropertiesAdminIPtr propAdmin =
+ new PropertiesAdminI(facetName, communicator->getProperties(), communicator->getLogger());
+ _communicator->addAdminFacet(propAdmin, facetName);
+
+ //
+ // If a metrics admin facet is setup for the service, register
+ // it with the IceBox communicator.
+ //
+ if(metricsAdmin)
+ {
+ _communicator->addAdminFacet(metricsAdmin, "IceBox.Service." + info.name + ".MetricsAdmin");
+
+ // Ensure the metrics admin facet is notified of property updates.
+ propAdmin->addUpdateCallback(metricsAdmin);
+ }
+
+ //
+ // Invoke the factory function.
+ //
+ SERVICE_FACTORY factory = (SERVICE_FACTORY)sym;
+ try
+ {
+ info.service = factory(_communicator);
+ }
+ catch(const FailureException&)
+ {
+ throw;
+ }
+ catch(const Exception& ex)
+ {
+ ostringstream s;
+ s << "ServiceManager: exception in entry point `" + entryPoint + "' for service " << info.name << ":\n";
+ s << ex;
+
+ FailureException e(__FILE__, __LINE__);
+ e.reason = s.str();
+ throw e;
+ }
+ catch(...)
+ {
+ ostringstream s;
+ s << "ServiceManager: unknown exception in entry point `" + entryPoint + "' for service " << info.name;
+
+ FailureException e(__FILE__, __LINE__);
+ e.reason = s.str();
+ throw e;
+ }
+
//
// Start the service.
//
try
{
- info.service->start(service, communicator, info.args);
- info.status = Started;
-
+ info.service->start(info.name, communicator, info.args);
+
//
// There is no need to notify the observers since the 'start all'
// (that indirectly calls this function) occurs before the creation of
@@ -656,71 +704,61 @@ IceBox::ServiceManagerI::start(const string& service, const string& entryPoint,
// object adapter (so before any observer can be registered)
//
}
+ catch(const FailureException&)
+ {
+ throw;
+ }
+ catch(const Exception& ex)
+ {
+ ostringstream s;
+ s << "ServiceManager: exception while starting service " << info.name << ":\n";
+ s << ex;
+
+ FailureException e(__FILE__, __LINE__);
+ e.reason = s.str();
+ throw e;
+ }
catch(...)
{
- if(info.communicator)
- {
- try
- {
- info.communicator->shutdown();
- info.communicator->waitForShutdown();
- }
- catch(const Ice::CommunicatorDestroyedException&)
- {
- //
- // Ignore, the service might have already destroyed
- // the communicator for its own reasons.
- //
- }
- catch(const Ice::Exception& ex)
- {
- Warning out(_logger);
- out << "ServiceManager: exception while shutting down communicator for service " << service
- << ":\n";
- out << ex;
- }
+ ostringstream s;
+ s << "ServiceManager: unknown exception while starting service " << info.name;
- try
- {
- info.communicator->destroy();
- info.communicator = 0;
- }
- catch(const Exception& ex)
- {
- Warning out(_logger);
- out << "ServiceManager: exception while destroying communicator for service " << service
- << ":\n";
- out << ex;
- }
- }
- throw;
+ FailureException e(__FILE__, __LINE__);
+ e.reason = s.str();
+ throw e;
}
info.library = library;
+ info.status = Started;
_services.push_back(info);
}
- catch(const FailureException&)
+ catch(const ObjectAdapterDeactivatedException&)
{
- throw;
+ //
+ // Can be raised by addAdminFacet if the service manager communicator has been shut down.
+ //
+ if(info.communicator)
+ {
+ destroyServiceCommunicator(info.name, info.communicator);
+ }
}
- catch(const Exception& ex)
+ catch(const Exception&)
{
- ostringstream s;
- s << "ServiceManager: exception while starting service " << service << ":\n";
- s << ex;
+ try
+ {
+ _communicator->removeAdminFacet("IceBox.Service." + info.name + ".Properties");
+ }
+ catch(const LocalException&)
+ {
+ // Ignored
+ }
- FailureException e(__FILE__, __LINE__);
- e.reason = s.str();
- throw e;
- }
- catch(...)
- {
- ostringstream s;
- s << "ServiceManager: unknown exception while starting service " << service;
+ if(info.communicator)
+ {
+ destroyServiceCommunicator(info.name, info.communicator);
+ }
- FailureException e(__FILE__, __LINE__);
- e.reason = s.str();
- throw e;
+ throw;
}
}
@@ -759,7 +797,7 @@ IceBox::ServiceManagerI::stopAll()
info.status = Stopped;
stoppedServices.push_back(info.name);
}
- catch(const Ice::Exception& ex)
+ catch(const Exception& ex)
{
Warning out(_logger);
out << "ServiceManager: exception while stopping service " << info.name << ":\n";
@@ -793,14 +831,14 @@ IceBox::ServiceManagerI::stopAll()
info.communicator->shutdown();
info.communicator->waitForShutdown();
}
- catch(const Ice::CommunicatorDestroyedException&)
+ catch(const CommunicatorDestroyedException&)
{
//
// Ignore, the service might have already destroyed
// the communicator for its own reasons.
//
}
- catch(const Ice::Exception& ex)
+ catch(const Exception& ex)
{
Warning out(_logger);
out << "ServiceManager: exception while stopping service " << info.name << ":\n";
@@ -978,3 +1016,37 @@ ServiceManagerI::observerCompleted(const Ice::AsyncResultPtr& result)
}
}
}
+
+void
+IceBox::ServiceManagerI::destroyServiceCommunicator(const string& service, const CommunicatorPtr& communicator)
+{
+ try
+ {
+ communicator->shutdown();
+ communicator->waitForShutdown();
+ }
+ catch(const CommunicatorDestroyedException&)
+ {
+ //
+ // Ignore, the service might have already destroyed
+ // the communicator for its own reasons.
+ //
+ }
+ catch(const Exception& ex)
+ {
+ Warning out(_logger);
+ out << "ServiceManager: exception in shutting down communicator for service " << service << ":\n";
+ out << ex;
+ }
+
+ try
+ {
+ communicator->destroy();
+ }
+ catch(const Exception& ex)
+ {
+ Warning out(_logger);
+ out << "ServiceManager: exception in shutting down communicator for service " << service << ":\n";
+ out << ex;
+ }
+}