diff options
Diffstat (limited to 'cpp/examples/qmf-agent/example.cpp')
-rw-r--r-- | cpp/examples/qmf-agent/example.cpp | 85 |
1 files changed, 60 insertions, 25 deletions
diff --git a/cpp/examples/qmf-agent/example.cpp b/cpp/examples/qmf-agent/example.cpp index 35ea97d4c0..5ab9c10c91 100644 --- a/cpp/examples/qmf-agent/example.cpp +++ b/cpp/examples/qmf-agent/example.cpp @@ -23,24 +23,28 @@ #include <qpid/management/ManagementObject.h> #include <qpid/agent/ManagementAgent.h> #include <qpid/sys/Mutex.h> -#include "Parent.h" -#include "Child.h" -#include "ArgsParentCreate_child.h" -#include "PackageQmf_example.h" - -#include <unistd.h> +#include <qpid/sys/Time.h> +#include "qmf/org/apache/qpid/agent/example/Parent.h" +#include "qmf/org/apache/qpid/agent/example/Child.h" +#include "qmf/org/apache/qpid/agent/example/ArgsParentCreate_child.h" +#include "qmf/org/apache/qpid/agent/example/EventChildCreated.h" +#include "qmf/org/apache/qpid/agent/example/Package.h" + +#include <signal.h> #include <cstdlib> #include <iostream> #include <sstream> -using namespace qpid::management; -using namespace qpid::sys; +static bool running = true; + using namespace std; +using qpid::management::ManagementAgent; using qpid::management::ManagementObject; using qpid::management::Manageable; using qpid::management::Args; using qpid::sys::Mutex; +namespace _qmf = qmf::org::apache::qpid::agent::example; class ChildClass; @@ -52,7 +56,7 @@ class CoreClass : public Manageable { string name; ManagementAgent* agent; - Parent* mgmtObject; + _qmf::Parent* mgmtObject; std::vector<ChildClass*> children; Mutex vectorLock; @@ -65,13 +69,13 @@ public: { return mgmtObject; } void doLoop(); - status_t ManagementMethod (uint32_t methodId, Args& args); + status_t ManagementMethod (uint32_t methodId, Args& args, string& text); }; class ChildClass : public Manageable { string name; - Child* mgmtObject; + _qmf::Child* mgmtObject; public: @@ -89,19 +93,20 @@ public: CoreClass::CoreClass(ManagementAgent* _agent, string _name) : name(_name), agent(_agent) { - mgmtObject = new Parent(agent, this, name); + static uint64_t persistId = 0x111222333444555LL; + mgmtObject = new _qmf::Parent(agent, this, name); - agent->addObject(mgmtObject); + agent->addObject(mgmtObject, persistId++); mgmtObject->set_state("IDLE"); } void CoreClass::doLoop() { // Periodically bump a counter to provide a changing statistical value - while (1) { - sleep(1); + while (running) { + qpid::sys::sleep(1); mgmtObject->inc_count(); - mgmtObject->set_state("IN LOOP"); + mgmtObject->set_state("IN_LOOP"); { Mutex::ScopedLock _lock(vectorLock); @@ -115,19 +120,21 @@ void CoreClass::doLoop() } } -Manageable::status_t CoreClass::ManagementMethod(uint32_t methodId, Args& args) +Manageable::status_t CoreClass::ManagementMethod(uint32_t methodId, Args& args, string& /*text*/) { Mutex::ScopedLock _lock(vectorLock); switch (methodId) { - case Parent::METHOD_CREATE_CHILD: - ArgsParentCreate_child& ioArgs = (ArgsParentCreate_child&) args; + case _qmf::Parent::METHOD_CREATE_CHILD: + _qmf::ArgsParentCreate_child& ioArgs = (_qmf::ArgsParentCreate_child&) args; ChildClass *child = new ChildClass(agent, this, ioArgs.i_name); ioArgs.o_childRef = child->GetManagementObject()->getObjectId(); children.push_back(child); + agent->raiseEvent(_qmf::EventChildCreated(ioArgs.i_name)); + return STATUS_OK; } @@ -136,7 +143,7 @@ Manageable::status_t CoreClass::ManagementMethod(uint32_t methodId, Args& args) ChildClass::ChildClass(ManagementAgent* agent, CoreClass* parent, string name) { - mgmtObject = new Child(agent, this, parent, name); + mgmtObject = new _qmf::Child(agent, this, parent, name); agent->addObject(mgmtObject); } @@ -145,20 +152,35 @@ ChildClass::ChildClass(ManagementAgent* agent, CoreClass* parent, string name) //============================================================== // Main program //============================================================== -int main(int argc, char** argv) { - ManagementAgent::Singleton singleton; + +ManagementAgent::Singleton* singleton; + +void shutdown(int) +{ + running = false; +} + +int main_int(int argc, char** argv) +{ + singleton = new ManagementAgent::Singleton(); const char* host = argc>1 ? argv[1] : "127.0.0.1"; int port = argc>2 ? atoi(argv[2]) : 5672; + qpid::client::ConnectionSettings settings; + + settings.host = host; + settings.port = port; + + signal(SIGINT, shutdown); // Create the qmf management agent - ManagementAgent* agent = singleton.getInstance(); + ManagementAgent* agent = singleton->getInstance(); // Register the Qmf_example schema with the agent - PackageQmf_example packageInit(agent); + _qmf::Package packageInit(agent); // Start the agent. It will attempt to make a connection to the // management broker - agent->init(string(host), port); + agent->init(settings, 5, false, ".magentdata"); // Allocate some core objects CoreClass core1(agent, "Example Core Object #1"); @@ -166,6 +188,19 @@ int main(int argc, char** argv) { CoreClass core3(agent, "Example Core Object #3"); core1.doLoop(); + + // done, cleanup and exit + delete singleton; + + return 0; } +int main(int argc, char** argv) +{ + try { + return main_int(argc, argv); + } catch(std::exception& e) { + cout << "Top Level Exception: " << e.what() << endl; + } +} |