diff options
-rw-r--r-- | cpp/bindings/qmf/ruby/qmf.rb | 4 | ||||
-rw-r--r-- | cpp/src/qmf/engine/ObjectImpl.h | 2 | ||||
-rw-r--r-- | cpp/src/qpid/management/ManagementAgent.cpp | 34 | ||||
-rw-r--r-- | cpp/src/qpid/management/ManagementAgent.h | 3 |
4 files changed, 37 insertions, 6 deletions
diff --git a/cpp/bindings/qmf/ruby/qmf.rb b/cpp/bindings/qmf/ruby/qmf.rb index 41c2c4a1ee..68a5ae7755 100644 --- a/cpp/bindings/qmf/ruby/qmf.rb +++ b/cpp/bindings/qmf/ruby/qmf.rb @@ -456,7 +456,7 @@ module Qmf attr_reader :impl, :agent_key def initialize(impl=nil) if impl - @impl = impl + @impl = Qmfengine::ObjectId.new(impl) else @impl = Qmfengine::ObjectId.new end @@ -594,7 +594,7 @@ module Qmf attr_reader :impl def initialize(kwargs = {}) if kwargs.include?(:impl) - @impl = kwargs[:impl] + @impl = Qmfengine::Query.new(kwargs[:impl]) else package = '' if kwargs.include?(:key) diff --git a/cpp/src/qmf/engine/ObjectImpl.h b/cpp/src/qmf/engine/ObjectImpl.h index ddd20bfea2..6f25867004 100644 --- a/cpp/src/qmf/engine/ObjectImpl.h +++ b/cpp/src/qmf/engine/ObjectImpl.h @@ -56,7 +56,7 @@ namespace engine { void destroy(); const ObjectId* getObjectId() const { return objectId.get(); } - void setObjectId(ObjectId* oid) { objectId.reset(oid); } + void setObjectId(ObjectId* oid) { objectId.reset(new ObjectId(*oid)); } const SchemaObjectClass* getClass() const { return objectClass; } Value* getValue(const std::string& key) const; void invokeMethod(const std::string& methodName, const Value* inArgs, void* context) const; diff --git a/cpp/src/qpid/management/ManagementAgent.cpp b/cpp/src/qpid/management/ManagementAgent.cpp index ae317512b8..2193ba4007 100644 --- a/cpp/src/qpid/management/ManagementAgent.cpp +++ b/cpp/src/qpid/management/ManagementAgent.cpp @@ -44,9 +44,11 @@ namespace _qmf = qmf::org::apache::qpid::broker; ManagementAgent::RemoteAgent::~RemoteAgent () { - if (mgmtObject != 0) - mgmtObject->resourceDestroy(); QPID_LOG(trace, "Remote Agent removed bank=[" << brokerBank << "." << agentBank << "]"); + if (mgmtObject != 0) { + mgmtObject->resourceDestroy(); + agent.deleteObjectNowLH(mgmtObject->getObjectId()); + } } ManagementAgent::ManagementAgent () : @@ -443,6 +445,32 @@ void ManagementAgent::periodicProcessing (void) } } +void ManagementAgent::deleteObjectNowLH(const ObjectId& oid) +{ + ManagementObjectMap::iterator iter = managementObjects.find(oid); + if (iter == managementObjects.end()) + return; + ManagementObject* object = iter->second; + if (!object->isDeleted()) + return; + +#define DNOW_BUFSIZE 2048 + char msgChars[DNOW_BUFSIZE]; + uint32_t contentSize; + Buffer msgBuffer(msgChars, DNOW_BUFSIZE); + + encodeHeader(msgBuffer, 'c'); + object->writeProperties(msgBuffer); + contentSize = msgBuffer.getPosition(); + msgBuffer.reset(); + stringstream key; + key << "console.obj.1.0." << object->getPackageName() << "." << object->getClassName(); + sendBuffer(msgBuffer, contentSize, mExchange, key.str()); + QPID_LOG(trace, "SEND Immediate(delete) ContentInd to=" << key.str()); + + managementObjects.erase(oid); +} + void ManagementAgent::sendCommandComplete (string replyToKey, uint32_t sequence, uint32_t code, string text) { @@ -871,7 +899,7 @@ void ManagementAgent::handleAttachRequestLH (Buffer& inBuffer, string replyToKey assignedBank = assignBankLH(requestedAgentBank); - RemoteAgent* agent = new RemoteAgent; + RemoteAgent* agent = new RemoteAgent(*this); agent->brokerBank = brokerBank; agent->agentBank = assignedBank; agent->routingKey = replyToKey; diff --git a/cpp/src/qpid/management/ManagementAgent.h b/cpp/src/qpid/management/ManagementAgent.h index d00dbf2b24..c64c073d8c 100644 --- a/cpp/src/qpid/management/ManagementAgent.h +++ b/cpp/src/qpid/management/ManagementAgent.h @@ -113,11 +113,13 @@ private: // struct RemoteAgent : public Manageable { + ManagementAgent& agent; uint32_t brokerBank; uint32_t agentBank; std::string routingKey; ObjectId connectionRef; qmf::org::apache::qpid::broker::Agent* mgmtObject; + RemoteAgent(ManagementAgent& _agent) : agent(_agent) {} ManagementObject* GetManagementObject (void) const { return mgmtObject; } virtual ~RemoteAgent (); }; @@ -212,6 +214,7 @@ private: void writeData (); void periodicProcessing (void); + void deleteObjectNowLH(const ObjectId& oid); void encodeHeader (framing::Buffer& buf, uint8_t opcode, uint32_t seq = 0); bool checkHeader (framing::Buffer& buf, uint8_t *opcode, uint32_t *seq); void sendBuffer (framing::Buffer& buf, |