summaryrefslogtreecommitdiff
path: root/cpp/examples/qmf-agent/example.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/examples/qmf-agent/example.cpp')
-rw-r--r--cpp/examples/qmf-agent/example.cpp85
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;
+ }
+}