diff options
author | Ted Ross <tross@apache.org> | 2011-02-03 02:46:01 +0000 |
---|---|---|
committer | Ted Ross <tross@apache.org> | 2011-02-03 02:46:01 +0000 |
commit | bc413d94f96b787f1a5f20f15100545a138cf62f (patch) | |
tree | 7cc1888fe495508d03658e11b477c803b1254c8a | |
parent | 3f506b8c7c48fd444690c0eea83f2af4e8445ce5 (diff) | |
download | qpid-python-bc413d94f96b787f1a5f20f15100545a138cf62f.tar.gz |
Added severity and timestamp fields to raised events.
Enhanced the example agent to illustrate the raising of events.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1066726 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | qpid/cpp/bindings/qmf2/examples/cpp/agent.cpp | 86 | ||||
-rw-r--r-- | qpid/cpp/include/qmf/AgentSession.h | 8 | ||||
-rw-r--r-- | qpid/cpp/src/qmf/AgentSession.cpp | 40 |
3 files changed, 98 insertions, 36 deletions
diff --git a/qpid/cpp/bindings/qmf2/examples/cpp/agent.cpp b/qpid/cpp/bindings/qmf2/examples/cpp/agent.cpp index 51643e203a..00554539eb 100644 --- a/qpid/cpp/bindings/qmf2/examples/cpp/agent.cpp +++ b/qpid/cpp/bindings/qmf2/examples/cpp/agent.cpp @@ -49,6 +49,7 @@ private: Schema sch_exception; Schema sch_control; Schema sch_child; + Schema sch_event; Data control; DataAddr controlAddr; @@ -115,6 +116,11 @@ void ExampleAgent::setupSchema() echoMethod.addArgument(SchemaProperty("map", SCHEMA_DATA_MAP, "{dir:INOUT}")); sch_control.addMethod(echoMethod); + SchemaMethod eventMethod("event", "{desc:'Raise an Event'}"); + eventMethod.addArgument(SchemaProperty("text", SCHEMA_DATA_STRING, "{dir:IN}")); + eventMethod.addArgument(SchemaProperty("severity", SCHEMA_DATA_INT, "{dir:IN}")); + sch_control.addMethod(eventMethod); + SchemaMethod failMethod("fail", "{desc:'Expected to Fail'}"); failMethod.addArgument(SchemaProperty("useString", SCHEMA_DATA_BOOL, "{dir:IN}")); failMethod.addArgument(SchemaProperty("stringVal", SCHEMA_DATA_STRING, "{dir:IN}")); @@ -133,11 +139,18 @@ void ExampleAgent::setupSchema() sch_child.addProperty(SchemaProperty("name", SCHEMA_DATA_STRING)); // + // Declare the event class + // + sch_event = Schema(SCHEMA_TYPE_EVENT, package, "event"); + sch_event.addProperty(SchemaProperty("text", SCHEMA_DATA_STRING)); + + // // Register our schemata with the agent session. // session.registerSchema(sch_exception); session.registerSchema(sch_control); session.registerSchema(sch_child); + session.registerSchema(sch_event); } void ExampleAgent::populateData() @@ -173,40 +186,55 @@ bool ExampleAgent::method(AgentEvent& event) const string& name(event.getMethodName()); control.setProperty("methodCount", control.getProperty("methodCount").asUint32() + 1); - if (controlAddr == event.getDataAddr()) { - if (name == "stop") { - cout << "Stopping: message=" << event.getArguments()["message"] << endl; - session.methodSuccess(event); - return false; - } + try { + if (controlAddr == event.getDataAddr()) { + if (name == "stop") { + cout << "Stopping: message=" << event.getArguments()["message"] << endl; + session.methodSuccess(event); + return false; + } - if (name == "echo") { - event.addReturnArgument("sequence", event.getArguments()["sequence"]); - event.addReturnArgument("map", event.getArguments()["map"]); - session.methodSuccess(event); - return true; - } + if (name == "echo") { + event.addReturnArgument("sequence", event.getArguments()["sequence"]); + event.addReturnArgument("map", event.getArguments()["map"]); + session.methodSuccess(event); + return true; + } - if (name == "fail") { - if (event.getArguments()["useString"]) - session.raiseException(event, event.getArguments()["stringVal"]); - else { - Data ex(sch_exception); - ex.setProperty("whatHappened", "It Failed"); - ex.setProperty("howBad", 75); - ex.setProperty("details", event.getArguments()["details"]); - session.raiseException(event, ex); + if (name == "event") { + Data ev(sch_event); + ev.setProperty("text", event.getArguments()["text"]); + session.raiseEvent(ev, event.getArguments()["severity"]); + session.methodSuccess(event); + return true; } - } - if (name == "create_child") { - const string& name(event.getArguments()["name"]); - Data child(sch_child); - child.setProperty("name", name); - DataAddr addr(session.addData(child, name)); - event.addReturnArgument("childAddr", addr.asMap()); - session.methodSuccess(event); + if (name == "fail") { + if (event.getArguments()["useString"]) + session.raiseException(event, event.getArguments()["stringVal"]); + else { + Data ex(sch_exception); + ex.setProperty("whatHappened", "It Failed"); + ex.setProperty("howBad", 75); + ex.setProperty("details", event.getArguments()["details"]); + session.raiseException(event, ex); + } + } + + if (name == "create_child") { + const string& name(event.getArguments()["name"]); + Data child(sch_child); + child.setProperty("name", name); + DataAddr addr(session.addData(child, name)); + event.addReturnArgument("childAddr", addr.asMap()); + session.methodSuccess(event); + } } + } catch (const exception& e) { + // + // Pass the exception on to the caller. + // + session.raiseException(event, e.what()); } return true; diff --git a/qpid/cpp/include/qmf/AgentSession.h b/qpid/cpp/include/qmf/AgentSession.h index 23058c56c6..d6ac5adf83 100644 --- a/qpid/cpp/include/qmf/AgentSession.h +++ b/qpid/cpp/include/qmf/AgentSession.h @@ -165,8 +165,14 @@ namespace qmf { /** * Raise an event to be sent into the QMF network. + * + * @param data - A data object that contains the event contents. + * @param severity - Explicit severity (from qmf/SchemaTypes.h). If omitted, the severity is set to + * the default severity for the data's schema. If the data has no schema, the severity defaults + * to SEV_NOTICE. */ - QMF_EXTERN void raiseEvent(const Data&); + QMF_EXTERN void raiseEvent(const Data& data); + QMF_EXTERN void raiseEvent(const Data& data, int severity); #ifndef SWIG private: diff --git a/qpid/cpp/src/qmf/AgentSession.cpp b/qpid/cpp/src/qmf/AgentSession.cpp index fb18f27150..30176a8c01 100644 --- a/qpid/cpp/src/qmf/AgentSession.cpp +++ b/qpid/cpp/src/qmf/AgentSession.cpp @@ -85,6 +85,7 @@ namespace qmf { void complete(AgentEvent& e); void methodSuccess(AgentEvent& e); void raiseEvent(const Data& d); + void raiseEvent(const Data& d, int s); private: typedef map<DataAddr, Data, DataAddrCompare> DataIndex; @@ -171,6 +172,7 @@ void AgentSession::response(AgentEvent& e, const Data& d) { impl->response(e, d) void AgentSession::complete(AgentEvent& e) { impl->complete(e); } void AgentSession::methodSuccess(AgentEvent& e) { impl->methodSuccess(e); } void AgentSession::raiseEvent(const Data& d) { impl->raiseEvent(d); } +void AgentSession::raiseEvent(const Data& d, int s) { impl->raiseEvent(d, s); } //======================================================================================== // Impl Method Bodies @@ -526,24 +528,50 @@ void AgentSessionImpl::methodSuccess(AgentEvent& event) void AgentSessionImpl::raiseEvent(const Data& data) { + int severity(SEV_NOTICE); + if (data.hasSchema()) { + const Schema& schema(DataImplAccess::get(data).getSchema()); + if (schema.isValid()) + severity = schema.getDefaultSeverity(); + } + + raiseEvent(data, severity); +} + + +void AgentSessionImpl::raiseEvent(const Data& data, int severity) +{ Message msg; Variant::Map map; Variant::Map& headers(msg.getProperties()); + string subject("agent.ind.event"); + + if (data.hasSchema()) { + const SchemaId& schemaId(data.getSchemaId()); + if (schemaId.getType() != SCHEMA_TYPE_EVENT) + throw QmfException("Cannot call raiseEvent on data that is not an Event"); + subject = subject + "." + schemaId.getPackageName() + "." + schemaId.getName(); + } - // TODO: add severity.package.class to key - // or modify to send only to subscriptions with matching queries + if (severity < SEV_EMERG || severity > SEV_DEBUG) + throw QmfException("Invalid severity value"); headers[protocol::HEADER_KEY_METHOD] = protocol::HEADER_METHOD_INDICATION; headers[protocol::HEADER_KEY_OPCODE] = protocol::HEADER_OPCODE_DATA_INDICATION; headers[protocol::HEADER_KEY_CONTENT] = protocol::HEADER_CONTENT_EVENT; headers[protocol::HEADER_KEY_AGENT] = agentName; headers[protocol::HEADER_KEY_APP_ID] = protocol::HEADER_APP_ID_QMF; - msg.setSubject("agent.ind.event"); - - encode(DataImplAccess::get(data).asMap(), msg); + msg.setSubject(subject); + + Variant::List list; + Variant::Map dataAsMap(DataImplAccess::get(data).asMap()); + dataAsMap["_severity"] = severity; + dataAsMap["_timestamp"] = uint64_t(qpid::sys::Duration(qpid::sys::EPOCH, qpid::sys::now())); + list.push_back(dataAsMap); + encode(list, msg); topicSender.send(msg); - QPID_LOG(trace, "SENT EventIndication to=agent.ind.event"); + QPID_LOG(trace, "SENT EventIndication to=" << subject); } |