diff options
author | Benoit Foucher <benoit@zeroc.com> | 2005-03-18 09:10:33 +0000 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2005-03-18 09:10:33 +0000 |
commit | 1e1e10dfbc1c51dab8ba69fadac2c0beb6e3141b (patch) | |
tree | c1678892bc0c174e949222c4b8c60ccce4f123dc /perf/src/IceStorm/Subscriber.cpp | |
parent | merging support for IcePHP binary to be installed with binary distributions (diff) | |
download | ice-1e1e10dfbc1c51dab8ba69fadac2c0beb6e3141b.tar.bz2 ice-1e1e10dfbc1c51dab8ba69fadac2c0beb6e3141b.tar.xz ice-1e1e10dfbc1c51dab8ba69fadac2c0beb6e3141b.zip |
Added IceStorm performance tests.
Diffstat (limited to 'perf/src/IceStorm/Subscriber.cpp')
-rw-r--r-- | perf/src/IceStorm/Subscriber.cpp | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/perf/src/IceStorm/Subscriber.cpp b/perf/src/IceStorm/Subscriber.cpp new file mode 100644 index 00000000000..17308579c6e --- /dev/null +++ b/perf/src/IceStorm/Subscriber.cpp @@ -0,0 +1,141 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2005 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 <Ice/Application.h> +#include <IceStorm/IceStorm.h> +#include <IceUtil/UUID.h> + +#include <PerfI.h> + +#include <map> + +#include <math.h> + +using namespace std; +using namespace Perf; + +class Subscriber : public Ice::Application +{ +public: + + virtual int run(int, char*[]); +}; + +int +main(int argc, char* argv[]) +{ + Subscriber app; + return app.main(argc, argv, "config"); +} + +int +Subscriber::run(int argc, char* argv[]) +{ + int repetitions = 10000; + bool batch = false; + bool twoway = false; + bool ordered = false; + int nPublishers = 1; + for(int i = 0; i < argc; i++) + { + if(strcmp(argv[i], "-r") == 0) + { + repetitions = atoi(argv[++i]); + } + if(strcmp(argv[i], "-b") == 0) + { + batch = true; + } + if(strcmp(argv[i], "-t") == 0) + { + twoway = true; + } + if(strcmp(argv[i], "-o") == 0) + { + ordered = true; + } + if(strcmp(argv[i], "-p") == 0) + { + nPublishers = atoi(argv[++i]); + } + } + + Ice::PropertiesPtr properties = communicator()->getProperties(); + + const string proxyProperty = "IceStorm.TopicManager.Proxy"; + string proxy = properties->getProperty(proxyProperty); + if(proxy.empty()) + { + cerr << appName() << ": property `" << proxyProperty << "' not set" << endl; + return EXIT_FAILURE; + } + + Ice::ObjectPrx base = communicator()->stringToProxy(proxy); + IceStorm::TopicManagerPrx manager = IceStorm::TopicManagerPrx::checkedCast(base); + if(!manager) + { + cerr << appName() << ": invalid proxy" << endl; + return EXIT_FAILURE; + } + + // + // Set the requested quality of service "reliability" = + // "batch". This tells IceStorm to send events to the subscriber + // in batches at regular intervals. + // + IceStorm::QoS qos; + if(batch) + { + qos["reliability"] = "batch"; + } + else if(twoway) + { + qos["reliability"] = "twoway"; + } + else if(ordered) + { + qos["reliability"] = "twoway-ordered"; + } + + // + // Create the servant to receive the events. + // + Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("Ping.Subscriber"); + Ice::ObjectPtr ping = new PingI(repetitions, nPublishers); + + // + // Add a Servant for the Ice Object. + // + Ice::ObjectPrx object = adapter->addWithUUID(ping); + IceStorm::TopicPrx topic; + try + { + topic = manager->retrieve("time"); + } + catch(const IceStorm::NoSuchTopic& e) + { + try + { + topic = manager->create("time"); + } + catch(const IceStorm::TopicExists&) + { + topic = manager->retrieve("time"); + } + } + topic->subscribe(qos, object); + + adapter->activate(); + shutdownOnInterrupt(); + communicator()->waitForShutdown(); + + topic->unsubscribe(object); + + return EXIT_SUCCESS; +} |